我有一个场景设置,我需要测试以查看 .bat 文件执行的结果是否返回结果。.bat 文件调用另一个 .exe,.bat 文件有一个 CMD DOS 窗口,该窗口将严重错误信息从 .exe 输出到该 DOS 框。如果 .exe 没有正确启动,我可以在我们的 SQL DB 中检查结果。我需要关闭当前的 .bat 文件并重新启动它。这看起来相当简单,我可以使用 WMI 调用获取 ProcessID。我可以使用 Terminate() 命令终止进程。这适用于我用于测试的任何 .exe:notepad、calc、iexplorer 等。当我运行 VBScript 以终止 .bat 文件时,它说它终止了 PID(它确实如此,因为我再也看不到 PID)但是,DOS 框仍处于打开状态,并且从 .bat 文件调用的 .exe 仍在运行。如果我点击“X” 在 DOS 框上或右键单击标题栏并选择“关闭”,DOS 框和 .exe 都将被杀死。如何让这个脚本正常工作。服务器运行的是 Windows Server 2003(有些是 x32,有些是 x64)。有任何想法吗?这是我的代码的一个版本,有几个版本:
If colFiles.Count = 0 Then
Wscript.Echo "The file does not exist on the remote computer."
Else
Wscript.Echo "The file exists on the remote computer."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process")
For Each objItem in colProcessList
If InStr(objItem.CommandLine, "r15_A.bat") Then
Wscript.Echo "Batch file: " & objItem.CommandLine & " Process ID: " & objItem.ProcessID & " Parent ID: " & objItem.ParentProcessID
Call TerminateProcess(objItem.ParentProcessID)
Call TerminateProcess(objItem.ProcessID)
End If
Next
dim shell
set shell=createobject("wscript.shell")
shell.run BATDIR & BATFILE
'set shell=nothing
End If
Function TerminateProcess(PID)
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Handle = '" & PID & "'")
For Each objProcess in colProcesses
On Error Resume Next
return = objProcess.Terminate()
Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Handle = '" & PID & "'")
If Error Then
TerminateProcess = FALSE
Else
TerminateProcess = TRUE
msgBox colProcesses.Count
End If
Next
End Function
我什至尝试使用 SendKeys 发送 ALt-F4、X、C 等。AppActivate 确实将正确的 DOS 框带到了前面。
Set WshShell = CreateObject("WScript.Shell")
WshShell.AppActivate "r15_A"
'WshShell.SendKeys("+{F10}")
WshShell.SendKeys("C")
提前致谢
编辑-------------- 是的,我将不得不终止这个 .bat 文件调用的进程。唯一的缺点是这个 DOS 框保持打开状态。烦人,但我可以忍受。最后,我编写了一个与我的第一个脚本类似的脚本,但仅通过检查 CommandLine 参数来检查我想要杀死的实例:(带有“-FAIL.txt”的代码的第一位测试是否存在 FAIL 文件,如果是,则执行其余的 scipts)
Set colFiles = objWMIService. _
ExecQuery("Select * From CIM_DataFile Where Name = 'S:\\servers\\Logs\\" & LOGFILE & "-FAIL.txt'")
If colFiles.Count = 0 Then
'Wscript.Echo "The file does not exist on the remote computer."
Else
'Wscript.Echo "The file exists on the remote computer."
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'AppStart.exe'")
For Each objProcess in colProcessList
IF instr(objProcess.CommandLine, "robo05-A") > 0 THEN
'msgBox "Found text"
objProcess.Terminate()
'This part restarts the failed .bat file.
wscript.sleep (200)
dim shell
set shell=createobject("wscript.shell")
shell.run BATDIR & BATFILE
'set shell=nothing
ELSE
'msgBox "Not found"
END IF
Next
End If