假设我们想要使用以下命令在Windows中创建一个空文件:
type nul > C:\does\not\exist\file.txt
该目录不存在,因此我们收到错误:
The system cannot find the path specified
如果打印出%errorlevel%
,则输出为:
echo %errorlevel%
0
然而命令没有成功!
我注意到,如果你使用重定向,windows不会设置最后一个命令的%errorlevel%
。
有解决方法吗?
答案 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
中对我来说。