Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理:错误级别在某些情况下不起作用_Batch File_Robocopy_Errorlevel - Fatal编程技术网

Batch file 批处理:错误级别在某些情况下不起作用

Batch file 批处理:错误级别在某些情况下不起作用,batch-file,robocopy,errorlevel,Batch File,Robocopy,Errorlevel,首先,让我解释一下我想实现的目标:我有一个GoPro摄像头,当记录多个时间间隔时,你会得到一大堆img文件,两个时间间隔被文件名中的数字除以。gxxxyyy是文件的标签,y代表图片所属的延时,x代表延时中的图片 我正在尝试创建一个程序,将每次延时放在不同的文件夹中(按x位置上的数字排序);我使用批处理,因为我已经有了一些经验 这是我写的程序: @echo off set loop=0 set fn=1 set session=1 :sort if %loop% LSS 1000 ( if %

首先,让我解释一下我想实现的目标:我有一个GoPro摄像头,当记录多个时间间隔时,你会得到一大堆img文件,两个时间间隔被文件名中的数字除以。gxxxyyy是文件的标签,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值来确定复制是否成功,因为如果它是下一个副本,则必须将其复制到另一个文件夹中,这就是我使用session变量的目的。但它总是将所有内容复制到“session1”文件夹中,而不是单独的文件夹中,即使我在x位置上有不同编号的文件

我试图找出问题所在,并使用“echo%ERRORLEVEL%”,然后在robocopy命令之后暂停,每次它只是说0,即使复制了文件


这就是问题所在,我无法理解为什么errorvalue没有改变。

ERRORLEVEL
是一个内置变量,而不是环境变量,因此您不应该在其周围使用百分号(
%
),而只是直接测试该值。正确的使用方法很简单

IF ERRORLEVEL 1 DoSomething

问题是您试图在块内部展开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
    )
....
)
请看

看看这个:

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


errorlevel为0表示成功。@indiv根据本页,errorvalue为1是我想要完成的:我明白了,谢谢您的澄清。
errorlevel
是一个内置值,不是环境变量,所以您不需要它周围的
%
<代码>如果ERRORLEVEL 1是测试设置错误的常用方法;注意这里没有
%
,也没有使用
eq
@KenWhite谢谢!,这解决了问题否,您不应该在没有百分比的情况下使用它,因为这样您就不会测试相等性,而是测试errorlevel是1还是1greater@jeb当前位置清楚地表明它没有百分比。除非你有引证证明不是这样,否则你是错的。直接引用该页面的第二个代码块示例:
如果不是错误级别1转到结束
。(海报在对原始问题的评论中还指出,此信息解决了问题。)您引用了IF命令的
IF ERRORLEVEL
语法,但这会导致许多问题,因为它并不明显地表示它没有进行平等性比较。但是
IF%ERRORLEVEL%eq
使用了
IF
命令的标准语法,并且更加清晰。顺便说一句,文件在很多方面是不正确和/或不完整的,所以不应该这样做referenced@jeb:那怎么办。我相信他通常都很清楚自己在说什么。他说这两者不一样,你不需要%s。我不是一个优秀的程序员。你能解释一下什么是解析器、块和延迟扩展吗。我知道上面给出的解决方案有效,但不是正确的方法?