未找到 netsh advfirewall 命令

未找到 netsh advfirewall 命令

我在 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 helperadvfirewall 的 .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

问题不在于需要简化脚本。链中缺少命令。

缺少firewallRunWait 命令

正确的有效代码是:

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

相关内容