我有三个批处理文件,
open.bat
run.bat
process.bat
open.bat
不断run.bat
呼叫...这三个run.bat
程序process.bat
都在继续运行,我知道有办法杀死 cmd.exe...但是,我的问题是如何杀死正在运行我的 batcg 文件的特定 cmd.exe?
就我而言,我需要在关闭open.bat
时终止process.bat
。我在这方面是新手,所以,请尽可能详细地指导我。谢谢。
cmd.exe / open.bat
cmd.exe / run.bat
cmd.exe / process.bat
如何提及特定的 cmd.exe 来杀死它?使用 vbs 还是 cmd?
提前致谢。。:)
答案1
在 vbscript 中,你可以这样做:
Option Explicit
Dim Process2Check, Process2Kill
Process2Check = "D:\process.bat"
Process2Kill = "D:\open.bat"
If AppPrevInstance() Then
MsgBox "Instance already running",VbExclamation,"Instance already running"
WScript.Quit
Else
Do
Call Main(Array(Process2Check))
Call Pause(1)
Loop
End If
'**************************************************************************
Sub Main(colProcessPaths)
Dim ProcessPath
For Each ProcessPath In colProcessPaths
CheckProcess(ProcessPath)
Next
End Sub
'**************************************************************************
Sub CheckProcess(ProcessPath)
Dim ProcessName : ProcessName = StripProcPath(ProcessPath)
With GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
With .ExecQuery("SELECT * FROM Win32_Process WHERE Commandline LIKE " & CommandLineLike(ProcessName))
If .Count = 0 Then
Call Kill(Process2Kill)
Else
Exit Sub
End if
End With
End With
End Sub
'**************************************************************************
Sub Kill(Process2kill)
Dim ProcessName : ProcessName = StripProcPath(Process2kill)
Dim Item,colItems
Set colItems = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")_
.ExecQuery("SELECT * FROM Win32_Process WHERE Commandline LIKE " & CommandLineLike(ProcessName))
For each Item in colItems
If colItems.Count <> 0 Then
Item.TERMINATE
WScript.Quit
End if
Next
End Sub
'**************************************************************************
Function AppPrevInstance()
With GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
With .ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE " & CommandLineLike(WScript.ScriptFullName) & _
" AND CommandLine LIKE '%WScript%' OR CommandLine LIKE '%cscript%'")
AppPrevInstance = (.Count > 1)
End With
End With
End Function
'**************************************************************************
Sub Pause(Sec)
Wscript.Sleep(Sec*1000)
End Sub
'**************************************************************************
Function StripProcPath(ProcessPath)
Dim arrStr : arrStr = Split(ProcessPath, "\")
StripProcPath = arrStr(UBound(arrStr))
End Function
'**************************************************************************
Function CommandLineLike(ProcessPath)
ProcessPath = Replace(ProcessPath, "\", "\\")
CommandLineLike = "'%" & ProcessPath & "%'"
End Function
'**************************************************************************
'Function to add doubles quotes into a variable
Function DblQuote(Str)
DblQuote = Chr(34) & Str & Chr(34)
End Function
'**************************************************************************