批处理脚本中MOVE命令失败后无法获取错误级别

7

我是这个论坛的新成员,首先感谢您在我成为会员之前就为我提供了解决方案 :)。

所以我有这段代码:

for %%a in ("%PBpath%") do ( 
move "network location 1 files" "network location 2" >NUL
if ERRORLEVEL 0 (echo Diagram %%~na.pdf was successfuly archived) else ( echo            Diagram %%~na.pdf was not archived )
ECHO.%errorlevel%
          )

问题在于我无法获得与0不同的错误级别。即使要复制的文件从位置中丢失,我仍然会收到成功归档的消息。我在论坛上搜索了类似的问题,但由于某种原因我无法使它工作。复制和ping命令之间是否有什么不同(ping命令返回正确的退出代码在错误级别中),因为我无法使用复制或移动获取它...谢谢!安德鲁
3个回答

7

关于 IF ERRORLEVEL 语句的奇怪之处在于它的行为与您的期望不同 - 当 errorlevel 等于或大于指定的数字时,它返回 TRUE。MOVE 失败会将 errorlevel 设置为 1(我刚刚检查过),这个值大于 0。因此,IF 语句中的第一个子句将始终被使用。修复脚本最简单的方法是反转 IF 语句中的条件。

if ERRORLEVEL 1 (echo file was not archived) else (echo file was successfully archived)

感谢您的回答。Superbob的答案确实解决了我的问题,非常感谢。这确实是一种违反直觉的行为。 然而,在我的示例中,ECHO.%errorlevel%命令仍然返回0,因此在我的情况下它没有被设置为1。 至于Endoro的答案,您能否更具体一些?我尝试使用%ERRORLEVEL%==0,因为没有其他选项可以将errorlevel作为变量使用,但这里也没有结果。 - user2844129
在IF ERRORLEVEL 1和ECHO.%errorlevel%之间有任何语句吗?如果有的话,它们可能会重置错误级别。我刚刚尝试了if ERRORLEVEL 1 (echo ErrorLevel %ERRORLEVEL%, 文件未归档) else (echo ErrorLevel %ERRORLEVEL%, 文件成功归档)并得到了预期的结果ErrorLevel 1, 文件未归档 - Superbob
1
不,我中间没有任何东西,但你是对的,它可以工作。问题是我在for循环内部回显了%ERRORLEVEL%,并且启用了DelayedExpansion。我必须使用!,然后它就可以工作了。谢谢你的帮助! - user2844129

3

只需使用%ERRORLEVEL%变量,而不是ERRORLEVEL函数。


0

如果想要使用ERRORLEVEL函数,Superbob's answer中提到了这一点(尽管我建议使用形式if NOT ERRORLEVEL 1 (echo file was successfully archived) else (echo file was not archived))。

但是,如果想要使用%ERRORLEVEL%变量方法,则需要打开Delayed Expansion。 OP的代码如下,带有推荐的更改:

setlocal enabledelayedexpansion

for %%a in ("%PBpath%") do (
  move "network location 1 files" "network location 2" >NUL
  if !ERRORLEVEL! equ 0 (
    echo Diagram %%~na.pdf was successfully archived
  ) else (
    echo Diagram %%~na.pdf was not archived)
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接