'重命名'命令将ERRORLEVEL设置为0,即使失败

时间:2017-12-01 13:47:49

标签: batch-file cmd

在我的批处理文件中,我想知道如果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%为零?这不可能,不是吗?

2 个答案:

答案 0 :(得分:1)

要获得在(code block)内更改的值,您需要使用此表单:!errorlevel!并在开头包含setlocal EnableDelayedExpansion命令;搜索"延迟扩展"在这个论坛......

答案 1 :(得分:0)

在命令提示符窗口if /?和旧的Microsoft支持文章Testing for a Specific Error Level in Batch Files中运行的帮助输出解释了如何在命令块外部测试先前命令/脚本/应用程序的退出代码以及在从MS-DOS到当前最新的Windows 10 Fall Creators Update的命令块中。

解决方案只是使用

if errorlevel 1 echo We got a problem.

代替行

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

如果先前执行的命令以大于或等于1的值退出,表示执行时出错而不是0表示执行成功,那么测试真的很容易。

我建议您另见Stack Overflow页面: