#windows #cmd #command-prompt
#Windows #cmd #командная строка
Вопрос:
У меня есть крошечный скрипт для уничтожения некоторых процессов. Он работает нормально, за исключением случаев, когда процесс не найден, он показывает сообщение об ошибке. Добавление 2 > nul
не решит проблему, поскольку ошибка будет удалена …
Как предотвратить отображение ошибки и показать какое-нибудь бесполезное сообщение?
for %%i in (%procs%) do (
TASKKILL /F /IM %%i > nul
if "%ERRORLEVEL%"=="0" (
echo %%i was stopped successfully
echo.
) else (
echo %%i was not started
)
)
Ответ №1:
Изменение синтаксиса, используемого для errorlevel
проверки (выражение if errorlevel n
означает, что уровень ошибки равен или больше n )
for %%i in (%procs%) do (
>nul 2>amp;1 TASKKILL /F /IM "%%~i"
if not errorlevel 1 (
echo %%i was stopped successfully
) else (
echo %%i was not started
)
)
Использование операторов условного выполнения ( amp;amp;
= выполнить, если предыдущая команда прошла успешно, ||
= выполнить, если предыдущая команда не удалась)
for %%i in (%procs%) do (
>nul 2>amp;1 TASKKILL /F /IM "%%~i" amp;amp; (
echo %%i was stopped successfully
) || (
echo %%i was not started
)
)
Использование отложенного расширения (без него, с errorlevel
заменой операции чтения значением внутри переменной при анализе полного блока, вы не сможете получить измененное значение)
setlocal enabledelayedexpansion
for %%i in (%procs%) do (
>nul 2>amp;1 TASKKILL /F /IM "%%~i"
if !errorlevel!==0 (
echo %%i was stopped successfully
) else (
echo %%i was not started
)
)
Но помните, что все эти примеры являются упрощением. Например taskkill
, также может произойти сбой, если процесс не может быть завершен.
Ответ №2:
Чтение EnableDelayedExpansion
Отложенное расширение приведет к расширению переменных во время выполнения, а не во время синтаксического анализа, эта опция включена
SETLOCAL
командой. При действии отложенного расширения на переменные можно ссылаться с помощью!variable_name!
(в дополнение к обычному%variable_name%
).
Setlocal EnableDelayedExpansion
for %%i in (%procs%) do (
TASKKILL /F /IM %%i 1>nul 2>amp;1
if "!ERRORLEVEL!"=="0" (
echo %%i was stopped successfully
echo.
) else (
echo %%i was not started
)
)
или
for %%i in (%procs%) do (
TASKKILL /F /IM %%i 1>nul 2>amp;1
if ERRORLEVEL 1 (
echo %%i was not started
) else (
echo %%i was stopped successfully
echo.
)
)
Обратите внимание, что TASKKILL
команда может завершиться ошибкой по другим причинам, не только из-за того, что процесс не запущен, например, если вы пытаетесь завершить процесс с повышенными правами из невыставленного cmd
приглашения.