Мені подобаються WMIC
і TASKLIST
інструменти, але вони недоступні в домашніх / базових виданнях windows.Інший спосіб - використовувати QPROCESS
команду, доступну майже на кожній машині Windows (для тих, у кого є термінальні сервіси - я думаю, виграю лише XP без SP2, тому практично кожен віконна машина):
@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
об'єктів через Windows скрипт хоста exe замість 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();