Использование пробелов в пакетной команде FOR / F - PullRequest
1 голос
/ 02 апреля 2019

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

set EXE=uTorrent.exe

FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% echo uTorrent is running...

, но следующее не удается ...

set EXE=Plex Media Server.exe

FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% echo Plex is running...

Я уверен, что это потому, что во втором имени процесса есть пробелы?

Не могли бы вы объяснить изменения, необходимые для решения этой проблемы?

Ответы [ 3 ]

0 голосов
/ 02 апреля 2019

Это не самый элегантный метод решения проблемы, но он показывает, как вы можете это сделать. Мы в основном определяем, сколько пробелов в имени приложения, а затем вызываем соответствующий FOR.

set EXE=Memory Compression
set count=0
for %%a in (%EXE%) do set /a count+=1
IF "%count%"=="1" FOR /F %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G" == "%EXE%" echo app is running...
IF "%count%"=="2" FOR /F  "tokens=1,2" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H" == "%EXE%" echo app is running...
IF "%count%"=="3" FOR /F  "tokens=1,2,3" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H %%I" == "%EXE%" echo app is running...
IF "%count%"=="4" FOR /F  "tokens=1,2,3,4" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H %%I %%J" == "%EXE%" echo app is running...
0 голосов
/ 03 апреля 2019

Вот мой первоначальный комментарий в качестве ответа:

@Set "EXE=Plex Media Server.exe"
@TaskList|Find /I "%EXE%">Nul&&Echo Plex is running...

Если вы хотите продолжить использовать метод цикла For, я бы предложил сделать это следующим образом:

@Set "EXE=Plex Media Server.exe"
@For /F Delims^=^" %%A In ('TaskList /Fi "ImageName Eq %EXE%" /Fo:CSV /NH'
)Do @If /I "%%A"=="%EXE%" Echo %%~nA is running...

Это можно было бы уточнить, добавив в команду Find что-то вроде ('TaskList /Fi "ImageName Eq %EXE%" /Fo:CSV /NH^|Find /I "%EXE%"'), но я пропустил это, потому что вы используете команду If для возвращенного вывода.

0 голосов
/ 02 апреля 2019

При использовании for /f и без указания tokens= по умолчанию используется 1 токен.А с разделителем пробелов по умолчанию это означает, что он соответствует только первому слову в ваших критериях поиска по нескольким словам.

Я попытался исправить пример, добавив "tokens=*" и заключив сравнение в двойные кавычки, ноэто только закончилось тем, что он захватил весь вывод из списка задач, который намного больше, чем просто имя процесса.

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

Cmd:

set "zTarget=Secure System"
tasklist /nh /fi "imagename eq %zTarget%" 2>&1 | findstr /c:"%zTarget%" >nul 2>&1 && (echo yes, {%zTarget%} is running) || (echo no, {%zTarget%} is not running)

Вывод:

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