在我的批处理文件中,我想知道为什么如果
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%
为零?这应该不可能吧?
要获取在 (code block)
内更改的
new值,您需要使用以下形式:
!errorlevel!
并在开头包含 setlocal EnableDelayedExpansion
命令;在此论坛中搜索“延迟扩展”...
在命令提示符窗口中运行的帮助输出
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)或程序(如RAR或7-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 页面: