Mi piacciono gli strumenti WMIC
e TASKLIST
ma non sono disponibili nelle edizioni home / basic di Windows. Un altro modo è usare il QPROCESS
comando disponibile su quasi tutti i computer Windows (per quelli che hanno servizi terminal - penso che vinca solo XP senza SP2, quindi praticamente tutti macchina 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
Il comando non è così potente come TASKLIST
ed è limitato nel mostrare solo 12 simboli del nome del processo ma dovrebbe essere preso in considerazione se TASKLIST
non è disponibile.
Utilizzo più semplice in cui utilizza il nome se il processo come argomento (il .exe
suffisso è obbligatorio in questo caso in cui si passa il nome eseguibile):
@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
La differenza tra due modi di QPROCESS
utilizzo è che QPROCESS *
elencherà tutti i processi mentre QPROCESS some.exe
filtrerà solo i processi per l'utente corrente.
Anche l'utilizzo di WMI
oggetti tramite exe host di script di Windows anziché WMIC
è un'opzione. Dovrebbe essere eseguito anche su tutti i computer Windows (esclusi quelli in cui il WSH è disattivato ma questo è un caso raro) .Qui file bat che elenca tutti i processi tramite WMI classi e possono essere usate al posto dello QPROCESS
script sopra (è un ibrido jscript / bat e dovrebbe essere salvato come .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 );
}
E una modifica che controllerà se un processo è in esecuzione:
@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 );
}
Le due opzioni potrebbero essere utilizzate su macchine che non hanno TASKLIST
.
L'ultima tecnica sta usando MSHTA
. Questo verrà eseguito su tutti i computer Windows da XP e versioni successive e non dipende dalle impostazioni dell'host di script di Windows. il call di MSHTA
potrebbe ridurre un po 'le prestazioni (di nuovo dovrebbe essere salvato come bat):
@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();