ฉันจะตรวจสอบว่าแอปพลิเคชันทำงานจากไฟล์ batch (well cmd) ได้อย่างไร?
ฉันไม่ต้องการเรียกใช้อินสแตนซ์อื่นหากโปรแกรมทำงานอยู่ (ฉันไม่สามารถเปลี่ยนแอปเพื่อให้เป็นอินสแตนซ์เดียวเท่านั้น)
นอกจากนี้แอปพลิเคชันอาจทำงานเป็นผู้ใช้ใดก็ได้
ฉันจะตรวจสอบว่าแอปพลิเคชันทำงานจากไฟล์ batch (well cmd) ได้อย่างไร?
ฉันไม่ต้องการเรียกใช้อินสแตนซ์อื่นหากโปรแกรมทำงานอยู่ (ฉันไม่สามารถเปลี่ยนแอปเพื่อให้เป็นอินสแตนซ์เดียวเท่านั้น)
นอกจากนี้แอปพลิเคชันอาจทำงานเป็นผู้ใช้ใดก็ได้
คำตอบ:
ความเป็นไปได้อีกประการหนึ่งที่ฉันเกิดขึ้นโดยได้รับแรงบันดาลใจจากการใช้grepคือ:
tasklist /FI "IMAGENAME eq myapp.exe" 2>NUL | find /I /N "myapp.exe">NUL
if "%ERRORLEVEL%"=="0" echo Program is running
ไม่จำเป็นต้องบันทึกไฟล์เพิ่มเติมดังนั้นฉันชอบวิธีนี้
tasklist /FI "IMAGENAME eq winword.exe" 2>NUL | find /I /N "winword.exe">NUL
/ if %ERRORLEVEL%==1 goto wordnotrunning
เพื่อให้มันใช้งานได้ (สงสัยว่ามีเครื่องหมายคำพูดล้อมรอบส่วน if
/?
หน้าจอความช่วยเหลือ ดังนั้นสำหรับตัวอย่างเช่นในรุ่นขัดIMAGENAME
NAZWA_OBRAZU
tasklist /FI "IMAGENAME eq myapp.exe" /NH | find /I /N "myapp.exe" >NUL
เป็น NUL แรกดูเหมือนว่าไม่จำเป็นฉันไม่รู้เลยว่า '2' สำหรับอะไร / NH เป็นตัวเลือก
นี่คือวิธีที่ฉันได้ทำมันออกมา:
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หากยังไม่ได้ทำงาน
แก้ไข: โปรดทราบว่าจะไม่พบแอปพลิเคชันที่ซ่อนอยู่จากรายการงาน ซึ่งจะรวมถึงงานที่กำหนดเวลาไว้ที่ทำงานเป็นผู้ใช้อื่นเนื่องจากจะถูกซ่อนโดยอัตโนมัติ
ฉันชอบโซลูชันของ 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
มันทำงานได้ดีสำหรับฉัน ...
คำแนะนำของ npocmaka ให้ใช้ QPROCESS แทนที่จะเป็น TASKLIST นั้นยอดเยี่ยม แต่คำตอบของมันนั้นใหญ่และซับซ้อนมากซึ่งฉันรู้สึกว่าต้องโพสต์เวอร์ชันที่เรียบง่ายมากซึ่งฉันเดาว่าจะแก้ปัญหาของผู้ใช้ที่ไม่ใช่คนขั้นสูงที่สุด:
QPROCESS "myprocess.exe">NUL
IF %ERRORLEVEL% EQU 0 ECHO "Process running"
รหัสข้างต้นได้รับการทดสอบใน Windows 7 โดยมีผู้ใช้ที่มีผู้ดูแลระบบอย่างเข้มงวด
ใน 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)
Only the administrator group members can use WMIC.EXE.
ตามด้วยReason:Win32 Error: Access is denied.
TASKLIST | FINDSTR ProgramName || START "" "Path\ProgramName.exe"
/i
เพิ่งทราบกรณีที่มีความละเอียดอ่อนของมันจนกว่าคุณจะเพิ่ม
ฉันใช้ 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
คำตอบของ 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!
อย่างไรก็ตามฉันหวังว่าจะช่วย ฉันรู้ว่าบางครั้งการอ่านแบทช์ / บรรทัดคำสั่งอาจทำให้สับสนในบางครั้งหากคุณเป็นมือใหม่อย่างฉัน
คำตอบให้โดยแมตต์ลาเซย์ทำงานสำหรับ 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
ฉันหวังว่านี่จะช่วยคนอื่นได้
ฉันชอบ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();
ฉันไม่รู้ว่าจะทำอย่างไรกับ built in CMD แต่ถ้าคุณมี grepคุณสามารถลองทำสิ่งต่อไปนี้:
tasklist /FI "IMAGENAME eq myApp.exe" | grep myApp.exe
if ERRORLEVEL 1 echo "myApp is not running"
เพียงกล่าวถึงหากชื่องานของคุณยาวจริง ๆ ก็จะไม่ปรากฏใน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
)
ฉันถือว่าหน้าต่างนี้ ดังนั้นคุณจะต้องใช้ WMI เพื่อรับข้อมูลนั้น ตรวจสอบการเขียนสคริปต์ของผู้ชายที่เก็บสำหรับจำนวนมากของตัวอย่างเกี่ยวกับวิธีการใช้ WMI จากสคริปต์
ฉันใช้สคริปต์ที่ได้รับจาก 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
คุณควรตรวจสอบชื่อการปกครองดูโครงการรหัสบทความเกี่ยวกับการแก้ปัญหาตาม .NET **
วิธีตรวจสอบโดยไม่มีโปรแกรม
c:\windows\notepad.exe
)สามารถตรวจสอบสิ่งเดียวกันได้โดยรับชื่อกระบวนการหลัก
เมื่อสร้างคำตอบของ 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.
)
อย่างที่เคยกล่าวไว้ก่อนหน้านี้ต้องมีสิทธิ์ของผู้ดูแลระบบ
Node - (computer name) ERROR: Description = Invalid query
ฉันต้องการโซลูชันด้วยการลองใหม่ รหัสนี้จะทำงานจนกว่าจะพบกระบวนการแล้วฆ่ามัน คุณสามารถตั้งค่าการหมดเวลาหรืออะไรก็ได้ตามต้องการ
หมายเหตุ:
:: 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
ฉันมักจะรันคำสั่งต่อไปนี้ในพรอมต์คำสั่งเพื่อตรวจสอบว่า program.exe ของฉันทำงานหรือไม่:
tasklist | grep program