Windows 将ERRORLEVEL重置为零的最简单方法是什么?

Windows 将ERRORLEVEL重置为零的最简单方法是什么?,windows,batch-file,cmd,errorlevel,Windows,Batch File,Cmd,Errorlevel,我有一个生成后事件,它为c#项目运行一些命令。最后一个命令有时会导致ERRORLEVEL值不等于零,然后生成失败 我想附加一行额外的命令,以始终将ERRORLEVEL值设置为零。最方便的方法是什么?似乎可以做到这一点: ver > nul 并不是每件事都有效,原因也不清楚。例如,以下情况不适用: echo. > nul cls > nul 我发现“退出0”看起来是处理此问题的好方法 用法示例: 在DevService/Y下的净停止 出口0 如果未启动UnderDevServ

我有一个生成后事件,它为c#项目运行一些命令。最后一个命令有时会导致ERRORLEVEL值不等于零,然后生成失败

我想附加一行额外的命令,以始终将ERRORLEVEL值设置为零。最方便的方法是什么?

似乎可以做到这一点:

ver > nul
并不是每件事都有效,原因也不清楚。例如,以下情况不适用:

echo. > nul
cls > nul
我发现“退出0”看起来是处理此问题的好方法

用法示例:

在DevService/Y下的净停止

出口0


如果未启动UnderDevService服务。

如果使用
退出/b 0
,则可以从子批处理脚本中返回
错误级别0
,而无需同时退出父批处理脚本

在编译前或编译后事件中,如果可执行文件的返回代码大于零,并且对可执行文件的调用不是编译前或编译后事件的最后一行,那么一种快速的方法是将其静音,并避免触发对非零
errorlevel
的检查,即在失败行后面加一行明确返回零:

cmd /c "exit /b 0"

这本质上是前面提到的解决方案的通用组合,它将不仅仅处理生成前或生成后事件的最后一行。

在每个可能失败的命令之后添加
>nul
,这似乎可以防止生成失败

您仍然可以通过检查
%errorlevel%
来检查命令的结果

例如:

findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it)

我使用
VERIFY
VERIFY>nul

我一直使用的

set ERRORLEVEL=0
我已经用了很多年了。

我在用这个:

ping localhost-n 1>null

如果这是一个类似“生成后事件”等的代码段,则可以添加:

(...) || ver > nul
在最后一个命令的末尾

或者

cmd /c "exit /b 0"
是非常干净和非惯用的-一个了解Windows shell的读者将知道发生了什么,以及您的意图是什么

但是,如果您使用的是批处理脚本,那么可能需要使用子脚本,它是akf答案中的“子批处理脚本”的轻量级等价物

有一个子程序:

:reset_error
exit /b 0
然后就

call :reset_error
无论你在哪里需要它

下面是一个完整的示例:

@echo off
rem *** main ***

call :raise_error
echo After :raise_error ERRORLEVEL = %ERRORLEVEL%

call :empty
echo After :empty ERRORLEVEL = %ERRORLEVEL%

call :reset_error
echo After :reset_error ERRORLEVEL = %ERRORLEVEL%

:: this is needed at the end of the main body of the script
goto:eof

rem *** subroutines ***

:empty
goto:eof

:raise_error
exit /b 1

:reset_error
exit /b 0
哪些产出:

After :raise_error ERRORLEVEL = 1
After :empty ERRORLEVEL = 1
After :reset_error ERRORLEVEL = 0
正如您所看到的-仅通过goto:eof呼叫和返回是不够的。

我个人使用这个:

cd.

即使在unixshell中也可以工作

但是,这个可能要快一点:

键入nul>nul

因为
Process Monitor
cd上显示
QueryDirectory
调用。

PS:
cd.
在unixshell中还有另一个很好的副作用。如果在擦除之前打开了终端中重新创建的工作目录,则会恢复该目录。

以下是重置
ErrorLevel
状态的一些其他方法,这些方法甚至可以在MS-DOS中工作(至少对于版本6.22):

morenul
rem//Windows中可以省略“>nul”部分,但MS-DOS中需要该部分,以避免返回换行符:
排序nul

以下方法仅适用于MS-DOS:

命令/?>努尔
fc nul nul>nul
键B>nul

为完整起见,这将
ErrorLevel
状态设置为
1
,对Windows和MS-DOS都有效:

在查看了所有其他答案后,我决定找出哪种方法是重置错误级别最有效的方法。我制作了一个快速脚本,记录了执行以下各项的时间:

"cmd /c "exit /b 0"", "cd .", "ver", "type nul", and "VERIFY"
以下是输出:

cmd/v:on/c set^“q=^”^“&timeit.cmd”cmd/c^!问^!退出/b 0^!问^!“cd”“版本”“键入nul”“验证”

cmd/c“退出/b 0”的时间为0:0:0.02(总计0.02s)

cd.拍摄时间为0:0:0.00(总共0.00秒)

Microsoft Windows[版本10.0.18362.836]

0:0:0.00(总计0.00秒)

类型nul采用0:0:0.00(总计0.00s)

验证已关闭。 验证0:0:0.00(总计0.00秒)


这花了0:0:0.06(总共0.06秒)

在Powershell中查看
Measure命令{Command}
后,我发现它只接受
cd.
cmd/c“exit/b0”
——我做错什么了吗

我建议您选择
cd.
typenul
,因为它们在控制台的输出上既没有占用空间,也没有任何慢动作


是的,我很无聊

在现代Windows(基于NT的)系统中,以下工作具有
cmd.exe

rem/*这将清除'ErrorLevel';空格实际上可以替换为
rem任意空间序列,制表符,`,`;`=`,NBSP,VTAB,FF:*/
(电话)
空间(或者更准确地说,是一个或多个标准令牌分隔符的任意序列,它们是空间(code
0x20
)、选项卡(code
0x09
)、
=
、NBSP(code
0xFF
)、VTAB(code
0x0B
)和FF(code0x0C
)是必需的;如果省略它,
ErrorLevel
将变为设置:

rem//这将'ErrorLevel'设置为'1':
(电话)
这项技术出现的地方有一条很好的线索


下面是另一种方法,但它访问文件系统,因此可能会稍微慢一点:

dir>nul
rem/*这可能会稍微快一点,因为给定的是特定的文件,而不是
rem而不仅仅是当前目录(`.`隐式地),如上所述:*/
目录/B“%ComSpec%”编号

我认为“echo”和“cls”不起作用的原因是因为它们是shell内置命令,而不是真正的程序。我会告诉你,但是ver.exe在哪里?在批处理命令行,“ver”返回MS windows版本,例如“Microsoft windows[version 6.1.7601]”。如果在命令shell中运行帮助,你会看到ver也是一个内置逗号