Проверяйте наличие ошибок, но не показывайте их

#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 приглашения.