这个命令
type nul > C:\does\not\exist\file.txt
当使用不存在的路径调用时,将在重定向失败时终止,并且不会调用type
。因此,它没有机会设置ERRORLEVEL
。由shell执行的重定向不会设置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
这是因为它分析了退出代码,而退出代码与错误级别不同:
退出代码可以直接通过重定向运算符(忽略ERRORLEVEL
的成功/失败)进行检测,这通常比信任ERRORLEVEL
更可靠,因为ERRORLEVEL
可能已正确或错误地设置。
Herbert Kleebauer在Usenet组alt.msdos.batch中向我解释了这一点。
更新:
一位匿名用户基于COPY
命令提出了另一种解决方案:
COPY NUL: C:\does\not\exist\file.txt
这个命令会设置
ERRORLEVEL
,下一个脚本中的命令可能会对其进行分析。非常方便,因此我感谢他提出的修改建议。
||
运算符,因为我喜欢它的紧凑性。所以在这个问题出现之前,我从未发现过这种奇怪的行为。 - dbenhamtype nul > C:\does\not\exist\file.txt || rem
的作用是什么。在我的机器上(Win Server 2012 R2),它没有改变ERRORLEVEL
- 它的值与重定向之前的最后一条命令设置的值相同。 - Ohad Schneidertype nul >"bogusPath\test.txt" || rem
将在路径“bogusPath\”不存在时将ERRORLEVEL设置为1。 - dbenhamecho
而不是type
,例如echo nul >"realpath.txt" || rem
,由于echo
不会改变ERRORLEVEL
,所以我没有看到变化。 - Ohad Schneider