Lubię narzędzia WMICi TASKLIST, ale nie są one dostępne w domowych / podstawowych edycjach systemu QPROCESSWindows. Innym sposobem jest użycie polecenia dostępnego na prawie każdym komputerze z systemem Windows (dla tych, które mają usługi terminalowe - myślę, że wygrywam tylko XP bez SP2, więc praktycznie każdy maszyna z systemem 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
QPROCESSpolecenie nie ma tak dużej mocy TASKLISTi jest ograniczone do wyświetlania tylko 12 symboli nazwy procesu, ale należy je wziąć pod uwagę, jeśli TASKLISTnie jest dostępne.
Prostsze użycie, gdy używa nazwy, jeśli proces jest argumentem ( .exesufiks jest obowiązkowy w tym przypadku, gdy przekazujesz nazwę pliku wykonywalnego):
@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
Różnica między dwoma sposobami QPROCESSużycia polega na tym, że QPROCESS *wyświetla listę wszystkich procesów, a QPROCESS some.exefiltruje tylko procesy dla bieżącego użytkownika.
Używanie WMIobiektów przez exe hosta skryptu Windows zamiast WMICjest również opcją. Powinien on działać również na każdym komputerze z systemem Windows (z wyjątkiem tych, w których WSH jest wyłączony, ale jest to rzadki przypadek). Oto plik nietoperzy, który zawiera listę wszystkich procesów za pośrednictwem WMI klas i mogą być używane zamiast QPROCESSw powyższym skrypcie (jest to hybryda jscript / bat i powinna zostać zapisana jako .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 );
}
I modyfikacja, która sprawdzi, czy proces jest uruchomiony:
@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 );
}
Dwie opcje mogą być używane na komputerach, które nie mają TASKLIST.
Wykorzystuje się najlepszą technikę MSHTA. Działa to na każdym komputerze z systemem Windows od XP i nowszych i nie zależy od ustawień hosta skryptu Windows. wywołanie MSHTAmoże nieco obniżyć wydajność (ponownie należy zapisać jako nietoperz):
@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();