使 sendKeys 更快

Make sendKeys faster

我正在尝试创建一个将打开 "command prompt" 并使用 "sendKeys" 打开特定端口的程序。这是我的代码:

Set Keys = CreateObject("WScript.Shell")
oShell.ShellExecute "cmd.exe","runas", 1
Sleep(0.01)
Keys.sendKeys "{ENTER}"
Sleep(0.01)
Keys.sendKeys "rem Open TCP Port 407 inbound and outbound"
Keys.sendKeys "{ENTER}"
Keys.sendKeys "netsh advfirewall firewall add rule name=""EXAMPLE"" dir=out action=allow protocol=TCP localport=407"
Keys.sendKeys "{ENTER}"
Keys.sendKeys "netsh advfirewall firewall add rule name=""EXAMPLE""  protocol=TCP dir=out localport=407 action=""allow"""
Keys.sendKeys "{ENTER}"

我觉得按键不够快

我不想使用 Keys.run "cmd [code]" 因为这样防病毒软件可能会认为该程序是病毒。

还有另一种方法可以做到这一点。不是杀毒软件专家...您可以检查一下这是否适合您。

Set oShell = CreateObject("WScript.Shell")

Set oExec = oShell.exec("%comspec%")

oExec.StdIn.Write "dir" & vbCrLf

对于任何想要消除延迟的人: 而不是做

Set Keys = CreateObject("WScript.Shell")
    Keys.sendKeys "a"
    Keys.sendKeys "{ENTER}"
    Keys.sendKeys "b"
    Keys.sendKeys "{ENTER}"
    Keys.sendKeys "c"
    Keys.sendKeys "{ENTER}

Set Keys = CreateObject("WScript.Shell")
Keys.sendKey "a{ENTER}b{ENTER}c{ENTER}"

它很乱,但速度更快。

您可以使用 WShell 直接执行命令并从 StdOut 或 StdErr 获取输出,而不是使用 SendKeys(对于没有命令行支持的程序,您通常会使用它作为最后的手段)。额外的好处是您可以检查 return 状态和输出以查看您的命令是成功还是失败。

See my answer here 作为示例,但为了您的方便,我将其包含在此处:

Option Explicit

Const WshRunning = 0
Const WshFinished = 1
Const WshFailed = 2

Dim shell : Set shell = CreateObject("WScript.Shell")
Dim exec : Set exec = shell.Exec("ping.exe 127.0.0.1 -n 1 -w 500")

While exec.Status = WshRunning
    WScript.Sleep 50
Wend

Dim output

If exec.Status = WshFailed Then
    output = exec.StdErr.ReadAll
Else
    output = exec.StdOut.ReadAll
End If

WScript.Echo output

或者,您可以将命令写入预制批处理文件并执行,而不是连续执行多个 WScript shell。