วิธีการฆ่า cmd.exe โดยเฉพาะจากชุดหรือ vbs?


0

ฉันมีสามไฟล์แบตช์

open.bat

run.bat

process.bat

open.bat โทร run.bat และ run.bat โทร process.bat .. ทั้งสามทำงานต่อไปฉันรู้ว่ามีวิธีที่จะฆ่า cmd.exe .. แต่ปัญหาของฉันคือวิธีที่จะฆ่า cmd.exe โดยเฉพาะซึ่งทำงานกับไฟล์ batcg ของฉันหรือไม่

ในกรณีของฉันฉันต้องฆ่า open.bat เมื่อ process.bat ถูกปิด. ฉันเป็นคนไม่มีอะไรในเรื่องนี้ดังนั้นแนะนำฉันให้มากที่สุดเท่าที่จะทำได้ ขอบคุณ.

cmd.exe / open.bat

cmd.exe / run.bat

cmd.exe / process.bat

วิธีการพูดถึง cmd.exe เฉพาะที่จะฆ่ามันได้หรือไม่ ใช้ vbs หรือ cmd?

ขอบคุณมากล่วงหน้า .. :)


นี่คือสิ่งที่เกิดขึ้นแล้ว คุณจะเริ่มแต่ละชุดไฟล์จากไฟล์ก่อนหน้าได้อย่างไร โดยทั่วไปแล้วการเปิดจะรอให้การทำงานและการเรียกใช้จะรอให้กระบวนการปิด เมื่อกระบวนการปิดตัวควบคุมจะถูกส่งกลับไปที่เรียกใช้เมื่อเรียกใช้ปิดการควบคุมจะถูกส่งกลับเป็นเปิดจากนั้นเปิดปิด
Appleoddity


ฉันได้เริ่มต้นแต่ละไฟล์แบตช์โดยใช้ call เมื่อ open.bat เรียก process.bat, open.bat จะยังคงทำงานเพื่อให้คำสั่งสำหรับ run.bat ดังนั้นทั้งสามไฟล์จะต้องทำงานในกรณีของฉัน แต่ถ้าผู้ใช้ปิด / ฆ่า process.bat มันต้องฆ่า open.bat และ run.bat ต้องทำงานต่อไป .. วิธีแก้ไขปัญหานี้?
Philip

@DavidPostill, PID นั้นเหมือนกันกับพีซีของผู้ใช้ทุกคนที่ใช้แบทช์ของฉันทั้งหมดหรือไม่ ฉันคิดว่าการกล่าวถึง PID จะใช้ได้กับพีซีของฉันเท่านั้น !! กรุณาอธิบาย ..
Philip

1
แตกต่างจาก Unix ที่ใช้งานเชลล์สคริปต์สร้างกระบวนการเชลล์ใหม่ตามค่าเริ่มต้นบน Windows ที่เรียกไฟล์แบตช์หรือไฟล์แบตช์ซ้อนหลายไฟล์เสร็จแล้ว ภายใน หนึ่ง กระบวนการ CMD.EXE . เพื่อให้ได้กระบวนการ 'เฉพาะ' คุณสามารถฆ่าแยกคุณต้อง start CMD หรือไฟล์ที่เชื่อมโยงกับ CMD (ไฟล์. bat ใดที่ปกติแล้วทำ) และ start ยังสามารถตั้งชื่อหน้าต่างใหม่เป็นค่าที่คุณสามารถกรองได้ /b ข้ามไป)
dave_thompson_085

คำตอบ:


0

ใน 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
'**************************************************************************
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.