Еще одно решение:
@echo off
echo Running tasks not in list:
echo/
setlocal EnableExtensions EnableDelayedExpansion
set "mylist=,csrss.exe,dwm.exe,System,smss.exe,cmd.exe,tasklist.exe,"
for /F "skip=3 eol=| tokens=1" %%I in ('%SystemRoot%\system32\tasklist.exe') do (
if "!mylist:,%%I,=!" == "!mylist!" echo %%I
)
endlocal
pause
Во-первых, существует переменная среды mylist
, определенная с каждым именем процесса, разделенным запятой, включая первый и последний.
FOR запускается в отдельном командном процессе, запущенном с cmd.exe /C
в фоновом режиме командной строки:
C:\Windows\system32\tasklist.exe
Это консольное приложение выводит все запущенные задачи с двумя строками заголовка и обычно System Idle Process
в качестве первого процесса для обработки STDOUT фонового командного процесса.
FOR захватывает эти выходные данные и обрабатывает их построчно, пропуская пустые строки, а также дополнительно всегда первые три строки из-за skip=3
.
Очень необычно, но тем не менее возможно, что имя исполняемого файла начинается с ;
, который является символом по умолчанию для опции конца строки FOR .По этой причине eol=|
переопределяет вертикальную черту как символ конца строки, который не может содержать имя файла, в результате чего строка процесса не игнорируется FOR .
tokens=1
приводит к первому пробелу /строка табуляции, назначаемая указанной переменной цикла I
.Таким образом, это решение работает только для процессов, имя файла которых не содержит пробел.
FOR выполняет IF , который выполняет сравнение строк с учетом регистра.Левая строка - это строковое значение, присвоенное переменной окружения mylist
, где все вхождения имени текущего процесса заключены в запятую с обеих сторон без учета регистра и заменены ничем.Правая строка - это неизмененное строковое значение, присвоенное переменной среды mylist
.
Таким образом, текущее имя процесса отсутствует в списке в левой строке, оно равно правой строке, поскольку ничего не удалено из левой строки.В этом случае выводится имя процесса.
cmd.exe
и tasklist.exe
всегда находятся в списке и поэтому должны всегда включаться в строку, присвоенную переменной среды mylist
.
Для пониманияиспользуемые команды и как они работают, откройте окно командной строки, выполните там следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.
echo /?
endlocal /?
for /?
if /?
pause /?
set /?
setlocal /?