VBScript 中使用 SendKeys 时出现意外行为

VBScript 中使用 SendKeys 时出现意外行为

我正在尝试创建一个 VBScript,以便从计划任务中运行它来重新启动我们的 SonicWall 防火墙。该防火墙是“低端”商业型号 (TZ400),我必须定期重新启动它,因为我们的互联网连接似乎陷入了困境(这是我以后必须研究的另一个问题)。

我在另一个网站上找到了以下代码,plink.exe并根据我的环境对其进行了修改:

Set sw= CreateObject("WScript.Shell")
sw.run"C:\plink\path\Plink.exe -ssh [email protected] -pw adminpassword"
WScript.Sleep 500

sw.SendKeys "restart"
sw.SendKeys "{Enter}"
WScript.Sleep 800

sw.SendKeys "yes"
sw.SendKeys "{Enter}"
WScript.Sleep 10000

sw.SendKeys "exit"
sw.SendKeys "{Enter}"

不幸的是,当我运行此脚本时,它似乎跳过了方法调用中的一些字符SendKeys。如果我从我的机器(Windows 7)运行它,我通常可以让它传递“足够”的字符以完成操作,但是当我尝试在服务器(Windows Server 2008 R2 - 我已通过 RDP 连接)上运行相同的脚本时,它完全失灵了。请参阅下面的屏幕截图,了解一次特别“错误”的尝试后的示例。

来自 VBScript 的 plink 会话

我尝试过在每个命令和其对应的命令之间设置延迟{ENTER},但这似乎只会让情况变得更糟。我尝试过将要发送的文本括在括号中,以防它与方法调用的语法有关,但这也无济于事。

据我所知,似乎命令提示符由于某种原因根本无法“跟上”该SendKeys方法。有没有其他人遇到过这个问题,有没有人建议如何最好地避免或绕过它?例如,有没有办法以某种方式“减慢”脚本的执行速度?提前感谢任何建议。


编辑:通过修改脚本以分别发送每个字符并在它们之间设置 100 毫秒的休眠时间,我已经能够使脚本在服务器上成功执行:

Set sw= CreateObject("WScript.Shell")
sw.run"C:\plink\path\Plink.exe -ssh [email protected] -pw adminpassword"
WScript.Sleep 500

sw.SendKeys "r"
WScript.Sleep 100
sw.SendKeys "e"
WScript.Sleep 100
sw.SendKeys "s"
WScript.Sleep 100
sw.SendKeys "t"
WScript.Sleep 100
sw.SendKeys "a"
WScript.Sleep 100
sw.SendKeys "r"
WScript.Sleep 100
sw.SendKeys "t"
WScript.Sleep 100
sw.SendKeys "{Enter}"
WScript.Sleep 800

sw.SendKeys "y"
WScript.Sleep 100
sw.SendKeys "e"
WScript.Sleep 100
sw.SendKeys "s"
WScript.Sleep 100
sw.SendKeys "{Enter}"
WScript.Sleep 10000

sw.SendKeys "e"
WScript.Sleep 100
sw.SendKeys "x"
WScript.Sleep 100
sw.SendKeys "i"
WScript.Sleep 100
sw.SendKeys "t"
WScript.Sleep 100
sw.SendKeys "{Enter}"

wScript.quit

虽然这个解决方法似乎有效,但它似乎有点“蛮力”并且实际上并没有解决潜在的问题,所以我仍然对任何想法或建议感兴趣。

笔记:虽然这确实允许我从命令行手动运行 VBScript,但我仍然无法从计划任务中运行它。它似乎可以启动和结束,但防火墙实际上从未重新启动。 没关系...我知道为什么它没有从计划任务中运行,我必须想出一个更好的脚本来处理这个特定的操作。

相关内容