在批处理文件中测试errorlevel不会返回预期的结果

时间:2017-03-24 04:42:06

标签: errorlevel

Windows 7 64位

我正在编写一个批处理文件,将文件从目录复制到另一个目录,然后删除该文件。有时,当运行批处理文件时,我希望复制的文件正由另一个程序写入,因此发出错误“进程无法访问该文件,因为它正被另一个进程使用”。我期待能够在这种情况下进行错误级别测试,并且当它存在时跳转到延迟然后重试。我无法获得IF ERRORLEVEL 1类型测试给我一个条件,所以我可以跳到我的延迟。我已尝试使用%around errorlevel等各种变体。我似乎无法得到它产生非0结果,即使知道它产生“进程无法访问文件...”错误。我发誓我曾经有过一次这样的工作,但我不能为我的生活弄清楚为什么它不再有效。我甚至在下面尝试了一个更简单的测试,它不会将失败的删除命令视为非零错误级别。如何构建一个正确的错误级别测试,它将获取失败的删除命令并允许我跳转到延迟?

:start
copy c:\users\pc\documents\recordings\*.mp3 c:\recordings
del c:\users\pc\documents\recordings\*.mp3
if errorlevel 1 goto delay
goto start
:delay
echo delay
ping 1.1.1.1 > nul
goto start

1 个答案:

答案 0 :(得分:0)

好吧,我能够以一种略微不同的方式来到这里。搜索后我找到了一些代码,让我基本上可以做我想要的。将此集成到我更大的脚本后,我可以跳出一个延迟,然后再试一次,直到文件不再被锁定。

@echo off
2>nul (
>>test.txt echo off
) && (echo file is not locked) || (echo file is locked)
然而,我很困惑,为什么我无法让错误级别检查工作。我发誓以前我有这个工作,但后来无法让它恢复工作。我已经做了很多搜索,并且没有真正想出一个确定的答案。如果有效,错误级别检查就会简单得多。

--- ---更新

我去搜索并找到了findstr命令并且玩了一些代码,想出了另一种方法。我" m"锁定"该文件使用只读属性产生不同的错误消息"访问被拒绝"但是我使用findstr搜索管道输入到tmp的错误代码,如果它做了一件事,如果没有,则做另一件事。似乎工作。我可以将它集成到我的代码中,看看它是如何工作的。

@echo off
cls
:start
del c:\recording.mp3 2> tmp > nul
findstr "Access" tmp > nul
if %ERRORLEVEL% EQU 0 GOTO delay
ECHO NO DELAY
ping 1.1.1.1 > nul
goto start
:delay
echo DELAY
ping 1.1.1.1 -n 1 > nul
goto start