Windows 将ERRORLEVEL重置为零的最简单方法是什么?
我有一个生成后事件,它为c#项目运行一些命令。最后一个命令有时会导致ERRORLEVEL值不等于零,然后生成失败 我想附加一行额外的命令,以始终将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
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:*/
(电话)
空间(或者更准确地说,是一个或多个标准令牌分隔符的任意序列,它们是空间(code0x20
)、选项卡(code0x09
)、、、、、=、NBSP(code0xFF
)、VTAB(code0x0B
)和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也是一个内置逗号