我想从我的批处理文件中获取以下输出:
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的理解是@符号将禁止打印命令。非常感谢任何帮助,谢谢!
答案 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"
- 由系统建立,但将被用户明确指定的设置覆盖。此类别中的其他变量包括time
,date
和cd
等。
call
到seterr
子程序用于设置errorlevel - 在本例中为4 ...