Me gustan las herramientas WMIC
y TASKLIST
, pero no están disponibles en las ediciones domésticas / básicas de QPROCESS
Windows. Otra forma es usar el comando disponible en casi todas las máquinas Windows (para las que tienen servicios de terminal, creo que solo ganan XP sin SP2, así que prácticamente todos máquina de ventanas):
@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
El comando no es tan poderoso TASKLIST
y está limitado en mostrar solo 12 símbolos del nombre del proceso, pero debe tenerse en cuenta si TASKLIST
no está disponible.
Uso más simple donde usa el nombre si el proceso es un argumento (el .exe
sufijo es obligatorio en este caso cuando pasa el nombre ejecutable):
@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 diferencia entre dos formas de QPROCESS
uso es que QPROCESS *
enumerará todos los procesos y QPROCESS some.exe
filtrará solo los procesos para el usuario actual.
El uso de WMI
objetos a través de Windows Script Host Exe en lugar de WMIC
también es una opción. Debería ejecutarse también en todas las máquinas Windows (excluyendo aquellas en las que WSH está apagado pero este es un caso raro). Aquí el archivo bat que enumera todos los procesos a través de WMI clases y se pueden usar en lugar de QPROCESS
en el script anterior (es un híbrido jscript / bat y se debe guardar como .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 );
}
Y una modificación que verificará si se está ejecutando un proceso:
@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 );
}
Las dos opciones podrían usarse en máquinas que no tienen TASKLIST
.
La última técnica es usar MSHTA
. Esto se ejecutará en todas las máquinas con Windows desde XP y superiores y no depende de la configuración del host de script de Windows. Sin MSHTA
embargo, la llamada de podría reducir un poco el rendimiento (nuevamente debe guardarse como 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();