Как перебирать задачи в Windows cmd и выводить задачу, только если ее нет в списке? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь вывести ненужные задачи в командную строку Windows.Конечным результатом должно быть то, что я в основном убиваю все ненужные задачи одним нажатием кнопки.Но, чтобы избежать каких-либо проблем, я пока выводю имена задач.Я знаю, что есть и другие способы, такие как отключение их на msconfig или regedit, но сейчас это то, что я хочу.

Проблема в том, что я долгое время не использовал консоль, и этооставил меня немного смущенным.У меня есть код ниже, который выводит все запущенные задачи, но не останавливает вывод задач в массиве mylist.Я думаю, что проблема в моем вложенном цикле for, но я не знаю других способов передачи двух массивов в один список, чтобы я мог их проверить.Любая помощь будет принята с благодарностью.

@echo off
set mylist=csrss.exe, dwm.exe, System, smss.exe Rem<<List
for /f "tokens=1" %%a in ('tasklist') do ( Rem<<This returns process name
    for %%b in ('%mylist%') do ( Rem<<b is MEANT to be each process in list
        if not %%a == %%b ( Rem<<If anything in tasklist is in mylist, don't include it
            echo %%a) Rem<<Output processes NOT in mylist.
    )
)
pause

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Еще одно решение:

@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 /?
0 голосов
/ 27 ноября 2018

Поскольку имена задач / изображений также могут содержать ПРОБЕЛЫ , я рекомендую не использовать список исключений, разделенный ПРОБЕЛ ;вместо этого я бы поместил элементы в текстовый файл, по одному элементу в строке, например, так:

csrss.exe
dwm.exe
System
smss.exe

Затем я бы написал список имен простых изображений, извлеченных извывод tasklist во временный файл, который я бы отфильтровал по findstr, например:

@echo off
set "_LIST=%~1"
set "_TMPF=%TEMP%\%~n0_%RANDOM%.tmp"

> "%_TMPF%" (
    for /F delims^=^"^ eol^=^" %%P in ('
        tasklist /FO CSV /NH
    ') do @(
        echo(%%P
    )
)
findstr /VIXG:"%_LIST%" "%_TMPF%"
del "%_TMPF%"

Файл списка можно указатьв качестве аргумента командной строки здесь.

Или вы также можете избежать временного файла и использовать вместо этого этот немного более сложный код:

@echo off
set "_LIST=%~1"

(
    for /F delims^^^=^^^"^^^ eol^^^=^^^" %%P in ('
        tasklist /FO CSV /NH
    ') do @(
        echo(%%P^& rem/
    )
) | findstr /VIXG:"%_LIST%"

Если вы хотите встроить списокэлементы в пакетном файле, вы можете сделать это, как в следующем примере:

@echo off
set "_TMPF=%TEMP%\%~n0_%RANDOM%.tmp"

> "%_TMPF%" (
    for /F delims^=^"^ eol^=^" %%P in ('
        tasklist /FO CSV /NH
    ') do @(
        echo ::::%%P
    )
)
for /F "delims=: eol=:" %%Q in ('
    findstr /BC:"::::" "%~f0" ^| findstr /VIXG:/ "%_TMPF%"
') do (
    echo(%%Q
)
del "%_TMPF%"

::LIST ITEMS:
::::csrss.exe
::::dwm.exe
::::System
::::smss.exe
0 голосов
/ 26 ноября 2018

это намного проще с помощью findstr:

@echo off
set "mylist=csrss.exe dwm.exe System smss.exe"
for /f "tokens=1" %%a in ('tasklist^|findstr /biv "%mylist%"') do echo %%a 
pause

findstr переключателей:
- b = начало строки
- i = игнорировать заглавные буквы (необязательно)
- v = исключить заданную строку (и)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...