Lubię narzędzia WMIC
i TASKLIST
, ale nie są one dostępne w domowych / podstawowych edycjach systemu QPROCESS
Windows. 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
QPROCESS
polecenie nie ma tak dużej mocy TASKLIST
i jest ograniczone do wyświetlania tylko 12 symboli nazwy procesu, ale należy je wziąć pod uwagę, jeśli TASKLIST
nie jest dostępne.
Prostsze użycie, gdy używa nazwy, jeśli proces jest argumentem ( .exe
sufiks 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 QPROCESS
użycia polega na tym, że QPROCESS *
wyświetla listę wszystkich procesów, a QPROCESS some.exe
filtruje tylko procesy dla bieżącego użytkownika.
Używanie WMI
obiektów przez exe hosta skryptu Windows zamiast WMIC
jest 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 QPROCESS
w 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 MSHTA
moż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();