批处理:Errorlevel在某些情况下不起作用

时间:2015-02-03 18:22:06

标签: batch-file robocopy errorlevel

首先让我解释一下我想要实现的目标:我有一个GoPro摄像头,当你录制多个时间段时,你最终会得到一大堆img文件,两个时间段被文件名中的数字除以。 Gxxxyyyy是文件的标签,y代表图片属于哪个时间推移,x代表延时的图片。

我正在尝试创建一个程序,将每个时间推移放在不同的文件夹中(按x位置的数字排序);我正在使用批处理,因为我已经有了一些经验。

这是我写的程序:

@echo off
set loop=0
set fn=1
set session=1

:sort
if %loop% LSS 1000 (

if %fn% GTR 99 (

    ROBOCOPY D:\Bureaublad\Output\Pictures D:\Bureaublad\Output\Pictures\Session%session% G%fn%*.JPG
    if %ERRORLEVEL% EQU 1 set /A session=%session%+1
)
if %fn% LSS 10 (

    ROBOCOPY D:\Bureaublad\Output\Pictures D:\Bureaublad\Output\Pictures\Session%session% G00%fn%*.JPG
    if %ERRORLEVEL% EQU 1 set /A session=%session%+1        
) ELSE (

    if %fn% LSS 100 (
ROBOCOPY D:\Bureaublad\Output\Pictures D:\Bureaublad\Output\Pictures\Session%session% G0%fn%*.JPG
    if %ERRORLEVEL% EQU 1 set /A session=%session%+1
    )
)

set /A fn=%fn%+1
set /A loop=%loop%+1
goto sort
)

我试图使用errorlevel值来确定副本是否成功,因为如果它是下一个副本必须是另一个文件夹,这是我使用的会话变量。但它总是将所有内容复制到" session1"文件夹,而不是单独的文件夹,即使我在x位置有不同数字的文件。

我试着搞清楚问题是什么并且使用了" echo%ERRORLEVEL%"然后在robocopy命令之后暂停,每次只是说0,即使文件被复制了。

这就是问题所在,我无法弄清楚为什么错误值不会发生变化。

3 个答案:

答案 0 :(得分:2)

问题是您尝试在块内扩展errorlevel。

在执行块之前解析块时,解析器完成百分比扩展。

您应该将扩展更改为延迟扩展。

@echo off
setlocal EnableDelayedExpansion
set loop=0
set fn=1
set session=1

:sort
if %loop% LSS 1000 (

    if !fn! GTR 99 (
        ROBOCOPY D:\Bureaublad\Output\Pictures D:\Bureaublad\Output\Pictures\Session!session! G!fn!*.JPG
        if !ERRORLEVEL! EQU 1 set /A session=session+1
    )
....
)

答案 1 :(得分:1)

ERRORLEVEL是一个内置变量,而不是环境变量,所以你不应该在它周围使用百分号(%),而只是直接测试该值。使用它的正确方法是

IF ERRORLEVEL 1 DoSomething

答案 2 :(得分:0)

请参阅robocopy exit codes

看看这个:

  

错误
  版本XP026即使失败也会返回成功错误级别。