我在 Windows 防火墙中设置了一个高级规则,我希望能够通过 AutoHotkey 脚本打开和关闭它。
RunWaitOne(command) {
shell := ComObjCreate("WScript.Shell")
exec := shell.Exec(ComSpec " /C " command)
return exec.StdOut.ReadAll()
}
!d::
if WinActive("ahk_exe Hearthstone.exe")
RunWaitOne("netsh advfirewall set rule name=hearthstone new enable=yes")
Sleep, 1000 ; 1000ms of delay between disconnecting and reconnecting
RunWaitOne("netsh advfirewall set rule name=hearthstone new enable=no")
return
当我通过面板打开和关闭规则时,它可以手动正常工作,但是当我手动测试脚本和操作时,我收到错误:未找到以下命令:advfirewall set rule name=hearthstone new enable=yes。
这问题建议它是一个缺少的帮助程序,但是当我运行netsh show helper
advfirewall 的 .DLL 时,它存在,所以我不知道如何进一步调试它。
编辑:是的,我已使用提升的权限运行 AHK。
答案1
这不是缺少帮助程序 - 您正在将整个命令字符串作为命令名称执行。没有可执行文件的名称是整个字符串“netsh advfirewall set rule...”。
我建议使用以下方法来简化脚本
RunWait 命令
代替ComObjCreate
。
你的命令可能如下所示:
!d::
if WinActive("ahk_exe Hearthstone.exe")
RunWait, %comspec% /c netsh advfirewall set rule name=hearthstone new enable=yes,,hide
Sleep, 1000 ; 1000ms of delay between disconnecting and reconnecting
RunWait, %comspec% /c netsh advfirewall set rule name=hearthstone new enable=no,,hide
return
答案2
问题不在于需要简化脚本。链中缺少命令。
缺少firewall
了RunWait 命令。
正确的有效代码是:
RunWaitOne(command) {
shell := ComObjCreate("WScript.Shell")
exec := shell.Exec(ComSpec " /C " command)
return exec.StdOut.ReadAll()
}
!d::
if WinActive("ahk_exe Hearthstone.exe")
RunWaitOne("netsh advfirewall firewall set rule name=hearthstone new enable=yes")
Sleep, 1000 ; 1000ms of delay between disconnecting and reconnecting
RunWaitOne("netsh advfirewall firewall set rule name=hearthstone new enable=no")
return