使 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。
我正在尝试创建一个将打开 "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。