批处理文件 - 如何组合多个echo语句并在一行上重置%errorlevel%?

时间:2014-04-03 17:10:37

标签: batch-file echo reset errorlevel

我想从我的批处理文件中获取以下输出:

 ERRORLEVEL has been reset from 4 to 0

...使用以下代码:

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

......问题是1)errorlevel没有重置为零,2)我最后收到一个回车符:

 ERRORLEVEL has been reset from 4 to 
 4

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

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

...输出结果为:

 Reset ERRORLEVEL
 ERRORLEVEL = 0

我无疑是编写批处理文件的初学者,但我做了大量的反复试验和研究。我正在使用"验证> nul"根据我在搜索此站点时发现的内容重置错误级别。我对使用@echo的理解是@符号将禁止打印命令。非常感谢任何帮助,谢谢!

4 个答案:

答案 0 :(得分:1)

@echo off
setlocal EnableDelayedExpansion

set /P "=ERRORLEVEL has been reset from %errorlevel% to " < NUL & verify>nul & echo !errorlevel!

答案 1 :(得分: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%

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

答案 2 :(得分:-1)

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

@echo off&cls
set $error=%errorlevel%
ver > nul
echo ERRORLEVEL has been reset from %$error% to 0

答案 3 :(得分:-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 of errorlevel if delayedexpansion`。

请注意,您不应为errorlevel分配值。它是"magic variable" - 由系统建立,但将被用户明确指定的设置覆盖。此类别中的其他变量包括timedatecd等。

callseterr子程序用于设置errorlevel - 在本例中为4 ...