Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
Variables 在循环中设置变量时遇到问题_Variables_Loops_Batch File_Errorlevel - Fatal编程技术网

Variables 在循环中设置变量时遇到问题

Variables 在循环中设置变量时遇到问题,variables,loops,batch-file,errorlevel,Variables,Loops,Batch File,Errorlevel,我正在尝试使用!错误等级!作为循环中的一个条件。我在一个调用中传递了error level,然后我尝试再次使用findstr设置error level,但条件没有看到更改 setlocal EnableDelayedExpansion for /F %%i in (%Newzips.lst%) do ( echo unzipping %%i >> test.log wzunzip -o %%i call :startloop

我正在尝试使用!错误等级!作为循环中的一个条件。我在一个调用中传递了error level,然后我尝试再次使用findstr设置error level,但条件没有看到更改

   setlocal EnableDelayedExpansion
   for /F %%i in  (%Newzips.lst%) do    (
    echo unzipping %%i >> test.log  
    wzunzip -o %%i
    call :startloop 
    )
   exit /B

   :startloop

   dir /b *.dat > %Stagedat.lst%
     for /F %%l in (%Stagedat.lst%) do (        
        dir /b E:\NOMADD_FILES\AV\*.dat > %AVdat.lst%
        findstr /i /c %%l %AVdat.lst%
        echo top error level - !errorlevel! 
        call :checkdup %%l !errorlevel!          
    )   
    exit /B

   :checkdup    
    if !errorlevel! == 0 (
        dir /b E:\NOMADD_FILES\AV\*.dat > %AVdat.lst%
        findstr /i %1 %AVdat.lst% >> test.log
        echo  found match so sleep e >> test.log
        echo error level - !errorlevel! >> test.log
        sleep 3
        echo duplicate in  AVdat.lst >> test.log
        call :checkdup %1 !errorlevel!
)
    if !errorlevel! == 1 (
        echo copying file %2 >> test.log
        move /Y %1 E:\NOMADD_FILES\AV
       sleep 5
       dir /b E:\NOMADD_FILES\AV\*.dat > %AVdat.lst%
       echo moveing AVdat.lst >> test.log
       echo error level - !errorlevel! >> test.log
       type %AVdat.lst% >> test.log
)
    exit /B



    :end 
所以,在我开始认真研究之后,会发生什么:checkdup和findstr再次运行!错误等级!正在更新为1,但仍保留在top if语句中

这是日志中的一个示例

    top error level - 0 
    bcs3_ammo_inv_updates.dat
    found match so sleep e 
    error level - 0 
    duplicate in  AVdat.lst 
    bcs3_ammo_inv_updates.dat
    found match so sleep e 
    error level - 0 
    duplicate in  AVdat.lst 
    bcs3_ammo_inv_updates.dat
    found match so sleep e 
    error level - 0 
    duplicate in  AVdat.lst 
    found match so sleep e 
    error level - 1 
    duplicate in  AVdat.lst 
    found match so sleep e 
    error level - 1 
    duplicate in  AVdat.lst 
    found match so sleep e 
    error level - 1 
因此,错误级别被设置为1,但它被卡在if中!错误级别!==0条件。它应该转到另一个检查并继续执行for循环。我已经在这上面呆了几天了,现在我尝试了很多不同的组合来让它工作


谢谢

第一条if语句中的递归是有意的吗?您最好使用GUI。或者您开始学习Windows命令Shell语言(也称为批处理语法)。是的,重复是有意的。如果存在重复文件,则需要等待,然后再次检查。一旦没有重复的文件,它应该将文件移到上面。一旦错误级别更改为1,它应该移动到较低的条件,但它会一直移动到最高条件。您可以看到,在上面的日志中,错误级别更改为1,但它仍然保留在if中!错误级别!==0条件。我试图做的是不覆盖阶段区域和流程区域之间的重复文件。一旦文件处理完毕,我就把另一个文件移过去。不。Sleep命令将errorlevel重置为0。这不是一个常见的变量。它在每次命令执行后更新。批处理执行sleep.exe,没有错误,所以errorlevel为0Wow,非常感谢。我真不敢相信这么小的问题。我把sleep3移到if语句下的第一个命令,它工作得很好。澄清-外部命令总是设置ERRORLEVEL,不管成功还是失败。.BAT文件中的内部命令仅在出错时设置errorlevel-成功不会将errorlevel重置为0。但是.CMD文件中的内部命令总是设置ERRORLEVEL,即使成功。
   :checkdup    

    if !errorlevel! == 0 (
        ...
        echo error level - !errorlevel! >> test.log
        sleep 3

        rem AND AFTER SLEEP, which is the value of errorlevel?

        call :checkdup %1 !errorlevel!
    )