Я использую Windows XP с пакетом обновления 3, и в реестре Windows по умолчанию включены командные расширения. Почему-то следующая команда не работает в этой версии Windows, но если я запускаю ее в Windows Server 2003 или Windows Vista Business, она работает нормально. Есть подсказка?
Проблема в том, что в Windows XP кажется, что параметр / f вообще не работает, а часть команды do никогда не выполняется.
Это команда:
for /f "tokens=1 delims=: " %A in ('tasklist /FI "IMAGENAME eq python.exe" /NH') do (
If "%A" == "python.exe" (
echo "It's running"
) Else (
echo "It's not running"
)
)
Заранее спасибо.





На моем компьютере с Windows XP работает следующее:
@echo off
for /f "tokens=1 delims=: " %%A in ('tasklist /FI "IMAGENAME eq java.exe" /NH') do (
If "%%A" == "java.exe" (
echo "It's running"
) Else (
echo "It's not running"
)
)
Обратите внимание на использование %%A
(Извините, я использовал java.exe, потому что во время моего теста python.exe не работал;))
Это потому, что tasklist.exe выводит на STDERR, когда задача не найдена. Цикл for /f может видеть только STDOUT, поэтому, если python.exe не запущен, ему нечего зацикливать.
Перенаправление STDERR в STDOUT (2>&1) работает:
for /F "tokens=1 delims=: " %A in ('tasklist /FI "IMAGENAME eq python.exe" /NH 2^>^&1') do (
if "%A"= = "python.exe" (
echo "It's running"
) else (
echo "It's not running"
)
)
Символы ^ - это escape-последовательности, необходимые для работы.
Кроме того, здесь учитывается регистр, поэтому он будет работать с python.exe, но не с Python.exe. Сделайте оператор if «if / i %% A equ python.exe», чтобы сделать его нечувствительным к регистру.
Это будет работать и не будет отображать
INFO: No tasks running with the specified criteria
сообщение:
@echo off
set found=0
for /f "tokens=1 delims=: " %%A in ('tasklist /NH') do (
If /i "%%A" equ "python.exe" (
set found=1
)
)
if %found%==1 (
@echo It's running
) else (
@echo It's not running
)
Ответ выше, который перенаправляет STDERR, лучше.
Set RUNNING=False
for /f "tokens=1 delims=: " %%a in ('tasklist /FI "IMAGENAME eq python.exe" /NH 2^>NUL') do (Set RUNNING=True)
If %RUNNING% == True (
@Echo It IS running
) ELSE (
@Echo It's NOT running
)
Я просто сохранил его исходный формат. Но да, это то, что вам нужно сделать.