วิธีตรวจสอบว่ากระบวนการทำงานผ่านชุดสคริปต์หรือไม่


260

ฉันจะตรวจสอบว่าแอปพลิเคชันทำงานจากไฟล์ batch (well cmd) ได้อย่างไร?

ฉันไม่ต้องการเรียกใช้อินสแตนซ์อื่นหากโปรแกรมทำงานอยู่ (ฉันไม่สามารถเปลี่ยนแอปเพื่อให้เป็นอินสแตนซ์เดียวเท่านั้น)

นอกจากนี้แอปพลิเคชันอาจทำงานเป็นผู้ใช้ใดก็ได้



12
คำถามที่ถามซ้ำห้าปีให้หลัง
Matt Lacey

@ LưuVĩnhPhúcพวกเขายังไม่ได้ใกล้เคียง
พระคาร์ดินัล - Reinstate Monica

@ JackKirby ที่บอกว่ามันไม่เกี่ยวข้องกัน?
phuclv

3
@oopsdazie ใช่ฉันอาจจะผิดในกรณีนี้ แต่กฎทั่วไปคือการเก็บคำถามด้วยชุดที่ดีที่สุดของคำตอบและปิดอีกคนหนึ่งซ้ำกันโดยไม่คำนึงถึงเวลา
phuclv

คำตอบ:


330

ความเป็นไปได้อีกประการหนึ่งที่ฉันเกิดขึ้นโดยได้รับแรงบันดาลใจจากการใช้grepคือ:

tasklist /FI "IMAGENAME eq myapp.exe" 2>NUL | find /I /N "myapp.exe">NUL
if "%ERRORLEVEL%"=="0" echo Program is running

ไม่จำเป็นต้องบันทึกไฟล์เพิ่มเติมดังนั้นฉันชอบวิธีนี้


7
มันใช้งานได้ดีสำหรับฉัน (windows XP SP3) IMHO นี่เป็นวิธีที่งดงามที่สุดของทั้งหมดที่เสนอที่นี่โดยใช้เพียงเครื่องมือที่มาพร้อมกับ windows
hello_earth

2
ฉันมีปัญหาทางไวยากรณ์กับบรรทัดคำสั่งนี้ ฉันเปลี่ยนเป็นtasklist /FI "IMAGENAME eq winword.exe" 2>NUL | find /I /N "winword.exe">NUL/ if %ERRORLEVEL%==1 goto wordnotrunningเพื่อให้มันใช้งานได้ (สงสัยว่ามีเครื่องหมายคำพูดล้อมรอบส่วน if
Steve B

4
โปรดจำไว้ว่าใน XP รุ่นภาษาอื่น ๆ ชื่อตัวกรองนั้นได้รับการแปลเป็นรหัส แต่ไม่ใช่ แต่ใน/?หน้าจอความช่วยเหลือ ดังนั้นสำหรับตัวอย่างเช่นในรุ่นขัดIMAGENAME NAZWA_OBRAZU
rsk82

3
ภายใต้ Win7 ฉันต้องเปลี่ยนtasklist /FI "IMAGENAME eq myapp.exe" /NH | find /I /N "myapp.exe" >NUL เป็น NUL แรกดูเหมือนว่าไม่จำเป็นฉันไม่รู้เลยว่า '2' สำหรับอะไร / NH เป็นตัวเลือก
Jan Doggen

12
รายการงานออกจากสถานะ 0 เสมอหรือไม่พบว่ามีงานจับคู่ใด ๆ หรือไม่ซึ่งเป็นเหตุผลว่าทำไมจึงไม่มีประโยชน์ด้วยตนเอง เนื่องจากคุณต้องใช้ find (หรือ findstr) เพื่อตรวจสอบผลลัพธ์ของมันต่อไปจึงไม่มีประโยชน์ในการใช้ตัวกรองของ tasklist เพียงแค่ทำรายการงาน | ค้นหา "myprog.exe"> nul: && goto foundit หรือ somesuch คุณอาจต้องใช้ตัวเลือก / v (verbose) ในรายการงาน
เดนิสฮาว

61

นี่คือวิธีที่ฉันได้ทำมันออกมา:

tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log

FOR /F %%A IN (search.log) DO IF %%~zA EQU 0 GOTO end

start notepad.exe

:end

del search.log

ด้านบนจะเปิดNotepadหากยังไม่ได้ทำงาน

แก้ไข: โปรดทราบว่าจะไม่พบแอปพลิเคชันที่ซ่อนอยู่จากรายการงาน ซึ่งจะรวมถึงงานที่กำหนดเวลาไว้ที่ทำงานเป็นผู้ใช้อื่นเนื่องจากจะถูกซ่อนโดยอัตโนมัติ


2
การเปลี่ยนรูปแบบรายการงานเป็น CSV หรืออะไรก็ได้ แต่ตารางมีความสำคัญเนื่องจากเป็นรูปแบบเริ่มต้น (ตาราง) ของรายการงานที่ตัดทอนชื่อรูปภาพแบบยาวซึ่งทำให้ตรรกะแตก
Scott White

4
วิธีนี้จะไม่ทำงานบน Vista เพราะ TASKLIST จะสร้างเอาต์พุตบางอย่างแม้ว่าจะไม่พบกระบวนการ ฉันคิดว่ามันเหมือนกันกับ Windows 7
dbenham

ไม่ทำงานใน Windows 10. search.log มี "INFO: ไม่มีงานใดทำงานอยู่ซึ่งตรงกับเกณฑ์ที่ระบุ" และไม่มีการเริ่ม notepad
Sergey

46

ฉันชอบโซลูชันของ Chaosmaster! แต่ฉันค้นหาวิธีแก้ปัญหาซึ่งไม่ได้เริ่มโปรแกรมภายนอกอื่น (เช่นfind.exeหรือfindstr.exe ) ดังนั้นฉันจึงเพิ่มแนวคิดจากโซลูชันของ Matt Lacey ซึ่งสร้างไฟล์ชั่วคราวที่สามารถหลีกเลี่ยงได้ ในตอนท้ายฉันพบวิธีแก้ปัญหาที่ค่อนข้างง่ายฉันจึงแบ่งปัน ...

SETLOCAL EnableExtensions
set EXE=myprog.exe
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
echo Not running
goto FIN
:FOUND
echo Running
:FIN

มันทำงานได้ดีสำหรับฉัน ...


โซลูชันนี้ใช้งานได้ดีผ่านการทดสอบใน Windows 8.1 ฉันสังเกตว่าเป็นกรณี ๆ ไป
oliver-clare

@ ลอร์ดสกรีนในขณะที่ฉันทำงานกับระบบ un * x case sensitive เป็นสิ่งที่ดีสำหรับฉัน! ฉันยังตั้งค่าระบบไฟล์เพื่อเปิดใช้งานชื่อไฟล์ที่คำนึงถึงขนาดตัวพิมพ์ ;)
TrueY

ทำงานได้ดีสำหรับฉันในการทดสอบใน windows 7 X64
Mr Rubix

สิ่งนี้จะไม่ทำงานหากแอปพลิเคชันมีช่องว่างในชื่อเมื่อ% x กลายเป็นส่วนหนึ่งของชื่อแอปพลิเคชันจนถึงช่องว่างแรก
Chris

ทางออกที่เป็นไปได้คือการตรวจสอบว่าไม่พบแอปพลิเคชันแทนโดยตรวจสอบว่า% x == INFO: แต่ฉันไม่ทราบว่า Windows รุ่นใดที่ใช้งานได้หรือว่ามีวิธีแก้ปัญหาที่ดีกว่า
Chris

21

คำแนะนำของ npocmaka ให้ใช้ QPROCESS แทนที่จะเป็น TASKLIST นั้นยอดเยี่ยม แต่คำตอบของมันนั้นใหญ่และซับซ้อนมากซึ่งฉันรู้สึกว่าต้องโพสต์เวอร์ชันที่เรียบง่ายมากซึ่งฉันเดาว่าจะแก้ปัญหาของผู้ใช้ที่ไม่ใช่คนขั้นสูงที่สุด:

QPROCESS "myprocess.exe">NUL
IF %ERRORLEVEL% EQU 0 ECHO "Process running"

รหัสข้างต้นได้รับการทดสอบใน Windows 7 โดยมีผู้ใช้ที่มีผู้ดูแลระบบอย่างเข้มงวด


ฉันเพิ่งใช้ความคิดนี้เพื่อหยุดกระบวนการอัตโนมัติที่จะยิงสองครั้งและมันก็ทำงานได้อย่างมีเสน่ห์!
เดวี่ C

ฉันต้องบอกว่าแตกต่างจากคำสั่งนี้แก้ปัญหางานไม่เพียง แต่ดูซับซ้อนเกินไปสำหรับแบบสอบถามง่าย ๆ แต่พวกเขายังทำงานที่สองหรือมากกว่านั้นและใช้ cpu มากมาย! สิ่งนี้ดีกว่ามากและใช้งานได้โดยไม่มีสิทธิ์ผู้ดูแลระบบ (Windows Server 2012)
Eugene Marin

นี่น่าจะเป็นทางออกที่ง่ายที่สุดและดีที่สุด (อย่างน้อยสำหรับฉัน) เพราะมันทำงานได้เหมือน - เมื่อแอปพลิเคชันมีช่องว่างในชื่อ ฉันอยากรู้ว่าข้อ จำกัด ของการแก้ปัญหานี้คืออะไรและทำไมมันถึงไม่มีเสียงโหวตมากขึ้น
Chris

20

ใน Windows คุณสามารถใช้ Windows Management Instrumentation (WMI) เพื่อให้แน่ใจว่าไม่มีแอพที่มีบรรทัดคำสั่งที่ระบุเปิดตัวอย่างเช่น:

wmic process where (name="nmake.exe") get commandline | findstr /i /c:"/f load.mak" /c:"/f build.mak" > NUL && (echo THE BUILD HAS BEEN STARTED ALREADY! > %ALREADY_STARTED% & exit /b 1)


โปรดทราบว่า WMIC ต้องการสิทธิ์ผู้ดูแลระบบ ถ้าคุณไม่มีมันก็ให้Only the administrator group members can use WMIC.EXE.ตามด้วยReason:Win32 Error: Access is denied.
Jeroen Wiert Pluimers

ฉันคิดว่านี่เป็นทางออกที่ดีที่สุดเพราะจะช่วยให้คุณ wmic บรรทัดคำสั่งที่สมบูรณ์เปิดตัวและข้อมูลอื่น ๆ ล้าน ...
Glavić

13
TASKLIST | FINDSTR ProgramName || START "" "Path\ProgramName.exe"

3
มันใช้งานได้ดีจริง ๆ ! ง่าย /iเพิ่งทราบกรณีที่มีความละเอียดอ่อนของมันจนกว่าคุณจะเพิ่ม
Jason

8

ฉันใช้ PV.exe จากhttp://www.teamcti.com/pview/prcview.htmติดตั้งใน Program Files \ PV ด้วยแบตช์ไฟล์ดังนี้:

@echo off
PATH=%PATH%;%PROGRAMFILES%\PV;%PROGRAMFILES%\YourProgram
PV.EXE YourProgram.exe >nul
if ERRORLEVEL 1 goto Process_NotFound
:Process_Found
echo YourProgram is running
goto END
:Process_NotFound
echo YourProgram is not running
YourProgram.exe
goto END
:END

1
สิ่งนี้ใช้ได้กับฉันใน windows 7 บรรทัดที่ 2 เป็นไดเรกทอรีที่มีโปรแกรมไม่ใช่ตัวโปรแกรมเอง
Fabio Cionini

8

คำตอบของ TrueY ดูเหมือนจะเป็นคำตอบที่ดีที่สุดอย่างไรก็ตามฉันต้องทำเรื่องยุ่ง ๆ เพราะฉันไม่เข้าใจว่าเกิดอะไรขึ้น ให้ฉันล้างสิ่งต่าง ๆ เพื่อหวังว่าจะได้ประหยัดเวลาสำหรับคนต่อไป

TrueY's แก้ไขคำตอบ:

::Change the name of notepad.exe to the process .exe that you're trying to track
::Process names are CASE SENSITIVE, so notepad.exe works but Notepad.exe does NOT
::Do not change IMAGENAME
::You can Copy and Paste this into an empty batch file and change the name of
::notepad.exe to the process you'd like to track
::Also, some large programs take a while to no longer show as not running, so
::give this batch a few seconds timer to avoid a false result!!

@echo off
SETLOCAL EnableExtensions

set EXE=notepad.exe

FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto ProcessFound

goto ProcessNotFound

:ProcessFound

echo %EXE% is running
goto END
:ProcessNotFound
echo %EXE% is not running
goto END
:END
echo Finished!

อย่างไรก็ตามฉันหวังว่าจะช่วย ฉันรู้ว่าบางครั้งการอ่านแบทช์ / บรรทัดคำสั่งอาจทำให้สับสนในบางครั้งหากคุณเป็นมือใหม่อย่างฉัน


6

คำตอบให้โดยแมตต์ลาเซย์ทำงานสำหรับ Windows XP อย่างไรก็ตามใน Windows Server 2003 บรรทัด

 tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log

ผลตอบแทน

ข้อมูล: ไม่มีงานใดทำงานอยู่ซึ่งตรงกับเกณฑ์ที่ระบุ

ซึ่งถูกอ่านเมื่อกระบวนการกำลังทำงาน

ฉันไม่มีประสบการณ์การสร้างสคริปต์แบบแบตช์ดังนั้นจิตวิญญาณของฉันคือค้นหาชื่อกระบวนการในsearch.logไฟล์และปั๊มผลลัพธ์เป็นไฟล์อื่นและค้นหาผลลัพธ์ใด ๆ

tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log

FINDSTR notepad.exe search.log > found.log

FOR /F %%A IN (found.log) DO IF %%~zA EQU 0 GOTO end

start notepad.exe

:end

del search.log
del found.log

ฉันหวังว่านี่จะช่วยคนอื่นได้


สิ่งนี้ใช้ได้กับ Win 2008 +1 สำหรับไม่มีงานกำลังทำงานซึ่งตรงกับเกณฑ์ที่ระบุ
Mangesh Pimpalkar

5

ฉันชอบWMICและTASKLISTเครื่องมือ แต่พวกเขาไม่สามารถใช้ได้ในบ้าน / รุ่นพื้นฐานของ windows วิธีอื่นคือการใช้QPROCESSคำสั่งที่มีอยู่ในเกือบทุกเครื่อง windows (สำหรับคนที่มีบริการเทอร์มินัล - ฉันคิดว่าชนะ XP โดยไม่ต้อง SP2 เท่านั้น เครื่อง windows):

@echo off
:check_process
setlocal
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
set process_to_check=%~1
:: QPROCESS can display only the first 12 symbols of the running process
:: If other tool is used the line bellow could be deleted
set process_to_check=%process_to_check:~0,12%

QPROCESS * | find /i "%process_to_check%" >nul 2>&1 && (
    echo process %process_to_check%  is running
) || (
    echo process %process_to_check%  is not running
)
endlocal

QPROCESSคำสั่งไม่ได้มีประสิทธิภาพมากเท่าที่TASKLISTและ จำกัด ในการแสดงเพียง 12 สัญลักษณ์ของชื่อกระบวนการ แต่ควรนำมาพิจารณาหากTASKLISTไม่สามารถใช้ได้

การใช้งานง่ายขึ้นซึ่งจะใช้ชื่อหากกระบวนการเป็นอาร์กิวเมนต์ ( .exeคำต่อท้ายมีผลบังคับใช้ในกรณีนี้เมื่อคุณส่งชื่อปฏิบัติการ):

@echo off
:check_process
setlocal
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
:: .exe suffix is mandatory
set "process_to_check=%~1"


QPROCESS "%process_to_check%" >nul 2>&1 && (
    echo process %process_to_check%  is running
) || (
    echo process %process_to_check%  is not running
)
endlocal

ความแตกต่างระหว่างการQPROCESSใช้งานสองวิธีคือQPROCESS *จะแสดงรายการกระบวนการทั้งหมดในขณะที่QPROCESS some.exeจะกรองเฉพาะกระบวนการสำหรับผู้ใช้ปัจจุบัน

การใช้WMIวัตถุผ่าน windows script host exe แทนที่จะWMICเป็นตัวเลือกนอกจากนี้ยังควรรันบนเครื่อง windows ทุกเครื่อง (ยกเว้นอันที่ WSH ถูกปิด แต่นี่เป็นกรณีที่หายาก) ไฟล์ค้างคาวที่แสดงรายการกระบวนการทั้งหมดผ่าน WMI คลาสและสามารถใช้แทนQPROCESSสคริปต์ด้านบน (เป็นไฮบริด jscript / bat และควรบันทึกเป็น.bat):

@if (@X)==(@Y) @end /* JSCRIPT COMMENT **


@echo off
cscript //E:JScript //nologo "%~f0"
exit /b

************** end of JSCRIPT COMMENT **/


var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2");
var colProcess = winmgmts.ExecQuery("Select * from Win32_Process");
var processes =  new Enumerator(colProcess);
for (;!processes.atEnd();processes.moveNext()) {
    var process=processes.item();
    WScript.Echo( process.processID + "   " + process.Name );
}

และการดัดแปลงที่จะตรวจสอบว่ากระบวนการกำลังทำงานอยู่หรือไม่:

@if (@X)==(@Y) @end /* JSCRIPT COMMENT **


@echo off
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
set process_to_check=%~1

cscript //E:JScript //nologo "%~f0" | find /i "%process_to_check%" >nul 2>&1 && (
    echo process %process_to_check%  is running
) || (
    echo process %process_to_check%  is not running
)

exit /b

************** end of JSCRIPT COMMENT **/


var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2");
var colProcess = winmgmts.ExecQuery("Select * from Win32_Process");
var processes =  new Enumerator(colProcess);
for (;!processes.atEnd();processes.moveNext()) {
    var process=processes.item();
    WScript.Echo( process.processID + "   " + process.Name );
}

TASKLISTสองตัวเลือกสามารถนำมาใช้ในเครื่องที่ไม่มี

MSHTAเทคนิคที่ดีที่สุดคือการใช้ สิ่งนี้จะทำงานในทุกเครื่อง windows จาก XP ขึ้นไปและไม่ขึ้นอยู่กับการตั้งค่าโฮสต์สคริปต์ windows การเรียกใช้MSHTAอาจลดประสิทธิภาพลงเล็กน้อย (ควรบันทึกเป็นแบ็ตอีกครั้ง):

@if (@X)==(@Y) @end /* JSCRIPT COMMENT **
@echo off

setlocal
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running

set process_to_check=%~1


mshta "about:<script language='javascript' src='file://%~dpnxf0'></script>" | find /i "%process_to_check%" >nul 2>&1 && (
    echo process %process_to_check%  is running
) || (
    echo process %process_to_check%  is not running
)
endlocal
exit /b
************** end of JSCRIPT COMMENT **/


   var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1);


   var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2");
   var colProcess = winmgmts.ExecQuery("Select * from Win32_Process");
   var processes =  new Enumerator(colProcess);
   for (;!processes.atEnd();processes.moveNext()) {
    var process=processes.item();
    fso.Write( process.processID + "   " + process.Name + "\n");
   }
   close();

2

ฉันไม่รู้ว่าจะทำอย่างไรกับ built in CMD แต่ถ้าคุณมี grepคุณสามารถลองทำสิ่งต่อไปนี้:

tasklist /FI "IMAGENAME eq myApp.exe" | grep myApp.exe
if ERRORLEVEL 1 echo "myApp is not running"

2

เพียงกล่าวถึงหากชื่องานของคุณยาวจริง ๆ ก็จะไม่ปรากฏในtasklistผลลัพธ์ทั้งหมดดังนั้นจึงอาจปลอดภัยกว่า (นอกเหนือจากการแปลเป็นภาษาท้องถิ่น) เพื่อตรวจสอบสิ่งที่ตรงกันข้าม

รูปแบบของคำตอบนี้ :

:: in case your task name is really long, check for the 'opposite' and find  the message when it's not there
tasklist /fi "imagename eq yourreallylongtasknamethatwontfitinthelist.exe" 2>NUL | find /I /N "no tasks are running">NUL
if "%errorlevel%"=="0" (
    echo Task Found
) else (
    echo Not Found Task
)

0

ฉันถือว่าหน้าต่างนี้ ดังนั้นคุณจะต้องใช้ WMI เพื่อรับข้อมูลนั้น ตรวจสอบการเขียนสคริปต์ของผู้ชายที่เก็บสำหรับจำนวนมากของตัวอย่างเกี่ยวกับวิธีการใช้ WMI จากสคริปต์


0

ฉันใช้สคริปต์ที่ได้รับจาก Matt (2008-10-02) สิ่งเดียวที่ฉันมีปัญหาคือมันจะไม่ลบsearch.logไฟล์ ฉันคาดหวังเพราะฉันต้องไปcdที่อื่นเพื่อเริ่มโปรแกรมของฉัน ฉันcdกลับไปที่ตำแหน่งไฟล์ BAT และsearch.logอยู่ แต่ก็ยังคงไม่ลบ ดังนั้นฉันจึงแก้ไขด้วยการลบsearch.logไฟล์ก่อนแทนที่จะเป็นไฟล์สุดท้าย

del search.log

tasklist /FI "IMAGENAME eq myprog.exe" /FO CSV > search.log

FOR /F %%A IN (search.log) DO IF %%-zA EQU 0 GOTO end

cd "C:\Program Files\MyLoc\bin"

myprog.exe myuser mypwd

:end

1
@ เซบาสเตียน: มีข้อมูลเพิ่มเติมเพิ่มเล็กน้อยที่นี่ดังนั้นฉันอยากจะฝากไว้เป็นคำตอบ
Bill the Lizard

0

คุณควรตรวจสอบชื่อการปกครองดูโครงการรหัสบทความเกี่ยวกับการแก้ปัญหาตาม .NET **

วิธีตรวจสอบโดยไม่มีโปรแกรม

  1. เปิด Cmd.exe
  2. เรียกใช้แอปพลิเคชัน (เช่นc:\windows\notepad.exe)
  3. ตรวจสอบคุณสมบัติของกระบวนการ Notepad.exe ในProcess Explorer
  4. ตรวจสอบกระบวนการหลัก (ซึ่งแสดง cmd.exe)

สามารถตรวจสอบสิ่งเดียวกันได้โดยรับชื่อกระบวนการหลัก


0

เมื่อสร้างคำตอบของ vtrzและคำตอบของSamuel Renkert ในหัวข้ออื่นฉันได้พบกับสคริปต์ต่อไปนี้ซึ่งจะทำงานเฉพาะ%EXEC_CMD%เมื่อยังไม่ได้ทำงาน:

@echo off
set EXEC_CMD="rsync.exe"
wmic process where (name=%EXEC_CMD%) get commandline | findstr /i %EXEC_CMD%> NUL
if errorlevel 1 (
    %EXEC_CMD% ...
) else (
    @echo not starting %EXEC_CMD%: already running.
)

อย่างที่เคยกล่าวไว้ก่อนหน้านี้ต้องมีสิทธิ์ของผู้ดูแลระบบ


ไม่ได้ผลสำหรับฉันและฉันใช้บัญชีผู้ดูแลระบบ กล่อง DOS ปรากฏขึ้นพร้อมกับNode - (computer name) ERROR: Description = Invalid query
khaverim

1
ทำงานได้ดีสำหรับฉัน
Mark Duncan

1
ใช้งานได้ดีสำหรับ Windows 7 ที่นี่ ไม่มีปัญหา
galacticninja

0

ฉันต้องการโซลูชันด้วยการลองใหม่ รหัสนี้จะทำงานจนกว่าจะพบกระบวนการแล้วฆ่ามัน คุณสามารถตั้งค่าการหมดเวลาหรืออะไรก็ได้ตามต้องการ

หมายเหตุ:

  • ".exe" เป็นข้อบังคับ
  • คุณสามารถทำให้ไฟล์ทำงานได้โดยใช้พารามิเตอร์รุ่นด้านล่าง
    :: Set programm you want to kill
    :: Fileextension is mandatory
    SET KillProg=explorer.exe

    :: Set waiting time between 2 requests in seconds
    SET /A "_wait=3"

    :ProcessNotFound
        tasklist /NH /FI "IMAGENAME eq %KillProg%" | FIND /I "%KillProg%"
        IF "%ERRORLEVEL%"=="0" (
            TASKKILL.EXE /F /T /IM %KillProg%
        ) ELSE (
            timeout /t %_wait%
            GOTO :ProcessNotFound
        )

taskkill.bat:

    :: Get program name from argumentlist
    IF NOT "%~1"=="" (
        SET "KillProg=%~1"
    ) ELSE (
        ECHO Usage: "%~nx0" ProgramToKill.exe & EXIT /B
    )

    :: Set waiting time between 2 requests in seconds
    SET /A "_wait=3"

    :ProcessNotFound
        tasklist /NH /FI "IMAGENAME eq %KillProg%" | FIND /I "%KillProg%"
        IF "%ERRORLEVEL%"=="0" (
            TASKKILL.EXE /F /T /IM %KillProg%
        ) ELSE (
            timeout /t %_wait%
            GOTO :ProcessNotFound
        )

ทำงานด้วย .\taskkill.bat ProgramToKill.exe


-2

ฉันมักจะรันคำสั่งต่อไปนี้ในพรอมต์คำสั่งเพื่อตรวจสอบว่า program.exe ของฉันทำงานหรือไม่:

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