检查错误,但不显示它们

Check for errors, but don't show them

我有一个用于终止某些进程的小脚本。它工作正常,除非找不到进程时显示错误消息。添加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
    )
)

更改用于 errorlevel 检查的语法(表达式 if errorlevel n 表示 如果错误级别等于或大于 n

for %%i in (%procs%) do (
    >nul 2>&1 TASKKILL /F /IM "%%~i" 
    if not errorlevel 1 (
        echo %%i was stopped successfully
    ) else (
        echo %%i was not started
    )
)

使用条件执行运算符(&& = 如果上一个命令成功则执行,|| = 如果上一个命令失败则执行)

for %%i in (%procs%) do (
    >nul 2>&1 TASKKILL /F /IM "%%~i" && (
        echo %%i was stopped successfully
    ) || (
        echo %%i was not started
    )
)

使用延迟扩展(没有它,errorlevel读取操作在解析完整块时替换为变量内部的值,您无法检索更改的值)

setlocal enabledelayedexpansion
for %%i in (%procs%) do (
    >nul 2>&1 TASKKILL /F /IM "%%~i" 
    if !errorlevel!==0 (
        echo %%i was stopped successfully
    ) else (
        echo %%i was not started
    )
)

但请记住,所有这些示例都是一种简化。前任。 taskkill 如果进程无法终止,也会失败。

阅读EnableDelayedExpansion

Delayed Expansion will cause variables to be expanded at execution time rather than at parse time, this option is turned on with the SETLOCAL command. When delayed expansion is in effect variables can be referenced using !variable_name! (in addition to the normal %variable_name%).

Setlocal EnableDelayedExpansion
for %%i in (%procs%) do (
    TASKKILL /F /IM %%i 1>nul 2>&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>&1
    if ERRORLEVEL 1 (
        echo %%i was not started
    ) else (
        echo %%i was stopped successfully
        echo.
    )
)

请注意,TASKKILL 命令可能因更多原因而失败,不仅仅是因为进程未运行,例如如果您试图从未提升的 cmd 提示中终止提升的进程。