2

我正在尝试从我的批处理文件中获取以下输出:

 ERRORLEVEL has been reset from 4 to 0

...通过使用以下代码:

 @echo ERRORLEVEL has been reset from %errorlevel% to & verify>nul & @echo %errorlevel

...问题是1)错误级别没有重置为零,2)最后我得到一个回车:

 ERRORLEVEL has been reset from 4 to 
 4

...当我将它分成单独的行时,它可以工作:

 @echo Reset ERRORLEVEL
 verify>nul
 @echo ERRORLEVEL = %errorlevel

...输出是:

 Reset ERRORLEVEL
 ERRORLEVEL = 0

诚然,我是编写批处理文件的初学者,但我已经做了很多试验和错误以及研究。我正在使用“verify>nul”根据我在搜索此站点时发现的内容来重置错误级别。我对使用@echo 的理解是@ 符号会抑制正在打印的命令。任何帮助将不胜感激,谢谢!

4

4 回答 4

1

您的代码没有为 %ErrorLevel% 显示两个不同值的原因是,在运行任何命令之前,环境变量已在整个命令行中替换。只有这样才能执行命令行。但是您需要在ver命令运行后进行第二次替换。

首先,您可以利用延迟扩展,其中由感叹号包围的环境变量仅在命令即将运行时才会扩展。要开启此模式,需要执行SETLOCAL ENABLEDELAYEDEXPANSION

SETLOCAL ENABLEDELAYEDEXPANSION

ECHO ERRORLEVEL has been reset from !ERRORLEVEL! to & verify>nul & ECHO !ERRORLEVEL!

(顺便说一句,延迟扩展似乎只适用于批处理文件,而不是命令行)。

不幸的是,没有办法阻止 ECHO 命令显示新行。因此,您被迫在一行中执行每个命令。但不要害怕,您只需要保存所有需要的值,并在一行中完成所有输出。

所以你的代码应该是:

@ECHO OFF
SET OriginalErrorLevel=%ERRORLEVEL%
verify>nul
SET NewErrorLevel=%ERRORLEVEL%
ECHO ERRORLEVEL has been reset from %OriginalErrorLevel% to %NewErrorLevel%

顺便说一句,不要费心在每个命令前加上“@”。只需在每个脚本的顶部使用@ECHO OFF ,除非您随后使用ECHO ON,否则不会显示任何命令。

于 2014-04-03T23:35:34.320 回答
1
@echo off
setlocal EnableDelayedExpansion

set /P "=ERRORLEVEL has been reset from %errorlevel% to " < NUL & verify>nul & echo !errorlevel!
于 2014-04-03T21:00:12.423 回答
-1
@echo off
setlocal EnableDelayedExpansion

call :seterr 4
verify>nul&echo ERRORLEVEL has been reset from %errorlevel% to !errorlevel!

GOTO :EOF

:seterr
exit /b %1

这利用了正常的解析特性,其中%errorlevel%将在解析时被实际错误级别替换 - 在执行之前。!errorlevel! **WILL** be resolved to the runtime-value oferrorlevelif延迟扩展`已被调用。

请注意,您不应为errorlevel. 它是"magic variable"由系统建立的,但会被用户明确做出的设置覆盖。此类别中的其他变量包括timedatecd等。

子程序的目的是设置错误级别 - 在本例中为4 call...seterr

于 2014-04-04T00:29:48.967 回答
-1

此方法适用于所有情况:(不仅在同一批次中)

@echo off&cls
set $error=%errorlevel%
ver > nul
echo ERRORLEVEL has been reset from %$error% to 0
于 2014-04-03T20:29:07.130 回答