Windows中的文件重定向和%errorlevel%

时间:2012-04-27 16:03:20

标签: windows batch-file error-handling io-redirection

假设我们想要使用以下命令在Windows中创建一个空文件:

type nul > C:\does\not\exist\file.txt

该目录不存在,因此我们收到错误:

The system cannot find the path specified

如果打印出%errorlevel%,则输出为:

echo %errorlevel%
0

然而命令没有成功!

我注意到,如果你使用重定向,windows不会设置最后一个命令的%errorlevel%

有解决方法吗?

2 个答案:

答案 0 :(得分:29)

您可以使用以下内容:

C:\>type nul > C:\does\not\exist\file.txt && echo ok || echo fail
The system cannot find the path specified.
fail

C:\>echo %errorlevel%
1

我总是假设&&和||运营商使用ERRORLEVEL,但显然不是。

非常好奇,只有在使用||时才会在重定向错误后设置ERRORLEVEL运营商。我从来没有猜到过。如果不是因为你的优秀问题,我也不会费心去测试。

如果您想要做的只是在重定向失败时设置ERRORLEVEL,那么您当然可以这样做:

type nul > C:\does\not\exist\file.txt || rem

答案 1 :(得分:1)

命令

type nul > C:\does\not\exist\file.txt
在重定向失败时终止使用不存在的路径调用的

,并且根本不调用type。因此,它没有机会设置ERRORLEVEL。由外壳执行的重定向未设置ERRORLEVEL

一种解决方案是使用非零值预先初始化ERRORLEVEL。如果失败,它将保持不变,如果成功,它将被重置为零(通过type):

@echo off
::pre-initialise ERRORLEVEL with a value of 1:
call :SETERROR 1
type NUL > NOSUCHDIR\test.txt
IF ERRORLEVEL 1 goto ERROR
echo All is well.
goto END
:ERROR
echo Error detected.
:END
goto :eof
:SETERROR
exit /b %1

轴形式

type NUL > NOSUCHDIR\test.txt && goto OK || goto ERROR

之所以有效,是因为它分析了退出代码,错误代码为not the same

  

可以使用重定向操作符直接检测到退出代码(成功/失败忽略ERRORLEVEL),这通常比信任ERRORLEVEL更为可靠,而信任alt.msdos.batch可能已经正确设置。

Herbert Kleebauer explained Usenet table name : TestCaseStatus TestName Status TimeStamp ABC Passed 11.10AM (Same Date) ABC Failed 11.00 AM ABC Failed 10.50 AM EFG Passed 11.00AM 123 Failed 11.10 AM 123 Passed 11.00 AM 中对我来说。