24

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

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

该目录不存在,所以我们得到错误:

The system cannot find the path specified

如果你打印%errorlevel%输出是:

echo %errorlevel%
0

然而命令没有成功!

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

有没有解决的办法?

4

2 回答 2

32

您可以使用以下内容:

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
于 2012-04-27T22:02:18.840 回答
1

命令

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,也可能未正确设置。

Herbert Kleebauer在 Usenet小组中向我解释了这一点。alt.msdos.batch

更新:
一位匿名用户根据以下COPY命令提出了替代解决方案:

COPY NUL: C:\does\not\exist\file.txt

这个命令确实 set ERRORLEVEL,可以通过脚本中的下一个命令来分析。非常方便,所以我感谢他提议的编辑。

于 2019-11-12T08:54:25.287 回答