“重命名”命令将 ERRORLEVEL 设置为 0,即使失败也如此

问题描述 投票:0回答:2

在我的批处理文件中,我想知道为什么如果

rename
失败,我无法创建用于错误处理的钩子。我创建了一个文件夹
foo
并使用 shell 将其 cwd 更改为 foo ,以便该文件夹不可重命名。然后我开始我的脚本:

for %%x in (%PROGRAMFILES(X86)%") do (
    for %%y in (foo) do (
        if exist "%%~x\%%~y" (
            rename "%%~x\%%~y" _to_be_removed
            echo %ERRORLEVEL%
            IF NOT %ERRORLEVEL% EQU 0 (echo We got a problem.)
        )
    )
)

不幸的是,我收到该文件夹无法删除的通知,因为它正在使用中:

Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
0

嗯?

rename
失败,但
%ERRORLEVEL%
为零?这应该不可能吧?

batch-file cmd
2个回答
1
投票

要获取在 (code block) 内更改的

new
值,您需要使用以下形式:
!errorlevel!
并在开头包含
setlocal EnableDelayedExpansion
命令;在此论坛中搜索“延迟扩展”...


1
投票

在命令提示符窗口中运行的帮助输出

if /?
解释了如何测试命令块外部以及从 MS-DOS 到当前最新 Windows 11 的命令块内部的先前命令/脚本/应用程序的退出代码。

解决方案很简单,使用:

if errorlevel 1 echo We got a problem.

而不是线条

echo %ERRORLEVEL%
IF NOT %ERRORLEVEL% EQU 0 (echo We got a problem.)

测试先前执行的命令是否退出时的值是否大于或等于1

(指示执行错误)而不是
0
(指示执行成功)非常容易。

还可以使用以下方法测试

Windows命令(如ROBOCOPY)或程序(如RAR7-Zip)的特定退出代码值:

if errorlevel 5 if not errorlevel 6 echo Exit code is 5.
第一个条件

if errorlevel 5

检查退出代码是否
大于或等于5
,这意味着它不能小于
5
,在此条件下计算结果为真。

第二个条件

if not errorlevel 6

检查退出代码是否
不大于或等于6
,仅在退出代码
小于6
时评估为true。

退出代码值

大于或等于 5

 
AND 小于 6
 必须为 
5
 才能满足这两个条件。

我建议还查看 Stack Overflow 页面:

  • 内部 cmd.exe 命令设置的 ERRORLEVEL 值是多少?
  • 哪些cmd.exe内部命令成功后将ERRORLEVEL清除为0?
  • 使用 Windows 批处理文件的单行多个命令
  • CMD中动态环境变量与普通环境变量的区别
© www.soinside.com 2019 - 2024. All rights reserved.