0

过去我不必编写太多批处理文件代码,我试图通过编写测试批处理文件来了解为什么其他人的代码失败。我的代码:

: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 并由回声返回一个值,那么我做错了什么请命令按照我的预期得到这个回声?(它永远不会碰到回声)

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

编辑:

Jeb 在下面的回答非常完美地回答了我的问题,但我未能继续推进。我们的问题代码如下:

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

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

4

2 回答 2

3

重定向错误似乎存在错误/功能。所以你需要一个小技巧来获取错误代码。

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

ECHO %ERRORLEVEL%

dbenham在这里描述了它

于 2012-06-28T10:42:28.133 回答
3

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

同样,解决方法是使用||运算符。只要命令成功并且成功时不将 ERRORLEVEL 设置为 0,则可以使用除 REM 之外的任何命令。该||操作实际上将 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% 在解析语句时会被扩展,这是在重定向有机会失败之前。

于 2012-06-28T11:38:41.177 回答