设置

设置

设置

我有一个 AutoHotKey 脚本,它显示 Windows 环境变量的值crnt

#c:: MsgBox, "crnt is " . %crnt%

问题

当我改变 crnt#c仍然显示旧值。

展示:

  • crnt 设置为 PATH_1
  1. 我按#c> “crnt 是 PATH_1”
  2. 我将 crnt 更改为“PATH_2”
  3. 我按下#c> “crnt 是 PATH_1”

不理想的结果

crnt 是 PATH_1

期望的结果

crnt 是 PATH_2

我尝试过的事情

没有 ahk:

右键单击文件并选择“运行脚本”是我发现的唯一成功重新加载 crnt 值的方法。

  • 然而,这很乏味,我正试图将其自动化。

当然,还有退出脚本和其他手动操作。

使用 ahk

从“运行脚本”自动热键文档部分

“在命令行上调用 AutoHotkey.exe 并将脚本的文件名作为命令行参数传递。}

  • 这使我相信以下命令应该有效:
  • C:\Program Files\AutoHotkey\> AutoHotkey.exe path\to\my\file.ahk
  • 但事实并非如此(我仍然得到“crnt is PATH_1”)。而且我没有得到错误。

重新加载:

  • #^c::Reload

我希望将其添加到我的脚本中将允许#^c热键使脚本重新加载 crnt 的值,但它没有,#c仍然给出 PATH_1。

补充说明

我如何改变crnt

没有 ahk:

  1. 打开“高级系统设置”
  2. “高级”选项卡
  3. 环境变量
  4. 突出显示 crnt
  5. 单击“编辑”
  6. 将值更改为 PATH_2
  7. 好好好
  • 我可以通过打开 cmd、运行echo %crnt%、查看 PATH_2 来确认这是否有效。
  • 即使 cmd 显示更新的值,我的 ahk 脚本也不会显示 PATH_2。

使用 ahk:

Run, cmd
Send, SET crnt=PATH_2{Enter}
Send, SETX crnt PATH_2{Enter}
  • 再次,我已确认值已改变,但 ahk 脚本仍然显示 PATH_1。

答案1

您需要使用 手动重新加载 crnt 的值EnvSet

出现此行为的原因是 AutoHotkey 脚本在首次加载时会导入所有系统和用户环境变量的副本。此 AutoHotkey 脚本生成的所有进程都会继承当前的环境变量集。

当您使用该Reload命令时,您正在使用脚本本身重新加载脚本。因此,重新加载的脚本将继承原始脚本的环境变量。

MsgBox % "Inherited value:`t" temp "`nActual value:`t" Env_UserRead("temp")

Env_UserNew("temp", "foobar")

q:: reload

; reset enviromental variables
Esc::
Env_UserNew("temp", Env_UserRead("tmp"))
MsgBox % "Restoring Environmental Variables...`nInherited value:`t" temp "`nActual value:`t" Env_UserRead("temp")
ExitApp

; From https://github.com/iseahound/Environment.ahk/blob/master/Environment.ahk
Env_UserNew(name, value := "", type := "", location := ""){
   type := (type) ? type : (value ~= "%") ? "REG_EXPAND_SZ" : "REG_SZ"
   RegWrite % type , % (location == "") ? "HKEY_CURRENT_USER\Environment" : location, % name, % value
   return (ErrorLevel) ? -1 : 0
}

Env_UserRead(name, value := "", location := ""){
   RegRead registry, % (location == "") ? "HKEY_CURRENT_USER\Environment" : location, % name
   if (value) {
      Loop Parse, registry, `;
      {
         if (A_LoopField = value) {
            return A_LoopField
         }
      }
      return ; Value not found
   }
   return registry
}

上面的脚本展示了这一概念的实际应用。首先,脚本使用“正常”环境变量进行加载。然后,脚本将变量更改为temp读取foobar。但是,当您按下q重新加载脚本时,它仍会将该temp变量视为正常变量。这是因为该Reload命令从上一个会话继承了环境变量,并且不检查新的环境变量!按下Esc恢复您的变量。

相关内容