BATCH - сохранить вывод команды в переменную - PullRequest
0 голосов
/ 05 мая 2018

Я хотел бы создать сценарий bat, который выполняет действие, только если запущено менее 2-х экземпляров cmd.exe. Мне удалось найти решение, которое хранит счетчик событий во временном файле, но я нахожу его очень не элегантным. Поэтому мой вопрос заключается в том, как сделать то же самое, что и ниже, без временного файла, а вместо этого, сохранив число вхождений, заданное @TASKLIST | FIND /I /C "%_process%", в переменной. Я видел, что может быть решение с циклом for, но я не мог заставить его работать, и в любом случае я действительно предпочел бы решение, основанное на SET (если это возможно).

@SET _process=cmd.exe
@SET _temp_file=tempfiletodelete.txt
@TASKLIST | FIND /I /C "%_process%" > %_temp_file%
@SET /p _count=<%_temp_file%
@DEL /f %_temp_file%
@IF %_count% LSS 2 (
    @ECHO action 1
) ELSE (
    @ECHO action 2
)

Редактировать: Этот вопрос похож на Сохранить вывод команды FIND в переменную , но я не смог применить решение к моей проблеме, и я хотел знать, если Возможно решение без цикла for.

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вы бы сделали это так, используя TaskList в цикле For:

@Set "_process=cmd.exe"
@For /F %%A In ('TaskList^|Find /C /I "%_process%"'
) Do @If %%A Lss 2 (Echo Action 1) Else Echo Action 2
@Pause

Вы также можете выполнить аналогичную вещь, используя WMIC:

@Set "_process=cmd.exe"
@For /F %%A In ('WMIC Process Get Name^|Find /C "%_process%"'
) Do @If %%A Lss 2 (Echo Action 1) Else Echo Action 2
@Pause

Они могут быть уточнены для обеспечения того, чтобы процессы, содержащие строку, а не соответствующие ей, не учитывались:

@Set "_process=cmd.exe"
@For /F %%A In ('TaskList /FI "ImageName Eq "%_Process%""^|Find /C "."'
) Do @If %%A Lss 2 (Echo Action 1) Else Echo Action 2
@Pause

1013 *

@Set "_process=cmd.exe"
@For /F %%A In (
    'WMIC Process Where "Name='%_process%'" Get Name^|Find /C "."'
) Do @If %%A Lss 2 (Echo Action 1) Else Echo Action 2
@Pause

Примечание :
Если вы действительно проверяете процесс cmd.exe, имейте в виду, что команда в круглых скобках For создается в новом экземпляре cmd.exe, (тем самым увеличивая ваш счет на 1)

0 голосов
/ 05 мая 2018

Команда FOR с параметром /F и команда или командная строка, заданные как set (строка в скобках), дополнительно заключенная в ', может использоваться для обработки выходных данных. команды или командной строки с несколькими командами в одной строке.

Вы можете использовать этот пакетный файл:

@ECHO OFF
SET "_process=cmd.exe"
FOR /F %%I IN ('%SystemRoot%\System32\tasklist.exe /FI "IMAGENAME eq %_process%" ^| %SystemRoot%\System32\find.exe /I /C "%_process%"') DO SET "_count=%%I"
IF /I "%_process%" == "cmd.exe" SET /A _count-=1
IF %_count% LSS 2 (
    ECHO action 1
) ELSE (
    ECHO action 2
)

Команда FOR выполняется в фоновом режиме без видимого консольного окна cmd.exe /C с командной строкой:

C:\Windows\System32\tasklist.exe /FI "IMAGENAME eq cmd.exe" | C:\Windows\System32\find.exe /I /C "cmd.exe"

TASKLIST опция /FI "IMAGENAME eq cmd.exe" фильтрует вывод TASKLIST уже для процессов с именем образа (= имя исполняемого файла) cmd.exe. Это ускоряет дальнейшую обработку и позволяет избежать запуска процесса с именем файла totalcmd.exe как cmd.exe, как в рассматриваемой командной строке.

Вывод TASKLIST , записанный для обработки STDOUT , перенаправляется для обработки STDIN команды FIND , которая обрабатывает строки и считает строки, содержащие cmd.exe в любом месте строки. FIND наконец выводит количество строк, содержащих искомую строку для обработки STDOUT командного процесса, выполняющегося в фоновом режиме.

Оператор перенаправления | должен быть экранирован с помощью символа вставки ^ on FOR , чтобы интерпретировать его как буквальный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , которая выполняет встроенную командную строку в отдельном командном процессе, запущенном в фоновом режиме.

FOR с опцией /F захватывает все, что записано для обработки STDOUT выполненной команды, и обрабатывает каждую строку. В этом случае FOR содержит только одну строку, содержащую только число. Поэтому не требуется никаких дополнительных опций для назначения номера, назначенного переменной цикла I с помощью FOR переменной среды _count с помощью команды SET .

Целью этого пакетного файла является подсчет числа cmd.exe процессов, уже запущенных. Поскольку командная строка с TASKLIST и FIND выполняется FOR в фоновом режиме с использованием еще одного процесса cmd.exe, необходимо вычесть счет на один чтобы получить правильный результат, используя арифметическое выражение, оцененное с SET /A _count-=1. Это уменьшение на единицу необходимо только для правильного подсчета количества cmd.exe процессов. Это не нужно для любого другого процесса.

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • echo /?
  • find /?
  • for /?
  • if /?
  • set /?
  • tasklist /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...