XP批处理文件中的错误级别报告

时间:2012-06-28 10:30:21

标签: batch-file windows-xp

我过去不必写很多批处理文件代码,我试图通过编写测试批处理文件来理解其他人的代码失败的原因。我的代码:

:DoUntil
type p.txt >> log.txt
if %ERRORLEVEL% EQU 0 goto DoUntil

ECHO %ERRORLEVEL%

p.txt是一个现有的文本文件,其字符串与log.txt一样简单。

然后我运行两次以获得错误:

The process cannot access the file because it is being used by another process.

正如您所期望的那样。现在我期望设置ERRORLEVEL和echo返回的值,所以我做错了请按照我的预期得到这个回声吗? (它永远不会响应回声)

或者我可以在任何地方获得“类型”可能的返回值列表吗?我发现谷歌搜索这个主题非常令人沮丧,因为所有条款都是常用的!我在这里阅读了一些其他问题,这些问题帮助我纠正了我的示例代码中的一个问题,但不是基本问题。

编辑:

杰布在下面的回答非常适合回答我的问题,但我没有把它推进。我们遇到的问题代码如下:

:DoUntil
type p.txt >> log.txt
if ERRORLEVEL 1 goto DoUntil

所以代码试图说“如果类型失败,重试直到它工作”。我们是说在if语句基本上什么都不做的类型的末尾没有“|| rem”子句+空语句?

2 个答案:

答案 0 :(得分:3)

似乎存在重定向错误的错误/功能。因此,您需要一个小技巧来获取错误代码。

:DoUntil
type p.txt >> log.txt || rem
if %ERRORLEVEL% EQU 0 goto DoUntil

ECHO %ERRORLEVEL%

由dbenham here

描述

答案 1 :(得分:3)

在最新的答案中回答你的最后一个问题 - 这并不是那么简单。如果重定向成功但TYPE失败(可能p.txt不存在),则IF将正确捕获TYPE返回的ERRORLEVEL。但是如果重定向失败,那么TYPE永远不会执行,并且ERRORLEVEL没有正确设置。因此,后续的IF正在测试语句运行之前存在的ERRORLEVEL的值。

同样,修复方法是使用||运算符。只要命令成功,任何命令都可以在REM之外使用,并且在成功时不将ERRORLEVEL设置为0。 ||操作实际上将ERRORLEVEL设置为失败重定向的结果。以下命令有可能进一步设置ERRORLEVEL。在||之后,REM可能是最安全的,可以保证最终的ERRORLEVEL符合您的要求。

以下是修补程序的一个变体,它将最后3行合并为1并且不使用REM

@echo off
setlocal enableDelayedExpansion
:loop
echo hello>test.txt && goto loop || echo !errorlevel!

或者,不使用延迟扩展

@echo off
:loop
echo hello>test.txt && goto loop || call echo %%errorlevel%%

我们不能简单地使用|| echo %errorlevel%,因为在解析语句时会扩展%errorlevel%,这是在重定向有可能失败之前。