设置
我有一个 AutoHotKey 脚本,它显示 Windows 环境变量的值crnt
:
#c:: MsgBox, "crnt is " . %crnt%
问题
当我改变 crnt#c
仍然显示旧值。
展示:
- crnt 设置为 PATH_1
- 我按
#c
> “crnt 是 PATH_1” - 我将 crnt 更改为“PATH_2”
- 我按下
#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:
- 打开“高级系统设置”
- “高级”选项卡
- 环境变量
- 突出显示 crnt
- 单击“编辑”
- 将值更改为 PATH_2
- 好好好
- 我可以通过打开 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
恢复您的变量。