Мне нравятся инструменты 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
объектов через exe-сервер сценариев Windows вместо WMIC
также является опцией. Его следует запускать и на каждой машине Windows (исключая те, где WSH выключен, но это редкий случай). Здесь bat файл, который перечисляет все процессы через классы 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
может немного снизить производительность (опять же следует сохранить как 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();