Возникли проблемы с установкой переменных в цикле

Я пытаюсь использовать !errorlevel! как условие внутри цикла. Я передаю уровень ошибки в вызове, а затем снова пытаюсь использовать findstr, чтобы установить уровень ошибки, но условие не видит изменений.

   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, !errorlevel! обновляется до 1, но все еще остается в верхнем операторе 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 !errorlevel! == 0 условие. Он должен перейти к другой проверке и продолжить цикл for. Я застрял на этом пару дней, пробуя много разных комбинаций, чтобы заставить его работать.

Спасибо


person user2920000    schedule 28.10.2013    source источник
comment
является ли эта рекурсия первой, если оператор преднамеренный?   -  person npocmaka    schedule 28.10.2013
comment
вам лучше использовать графический интерфейс. Или вы начинаете узнавать что-то о языке командной оболочки Windows (также известном как пакетный синтаксис).   -  person Endoro    schedule 28.10.2013
comment
Да, рекурсия преднамеренная. Если есть дубликат файла, ему нужно подождать, а затем проверить снова. Если дубликата нет, он должен переместить файл. Как только уровень ошибки изменится на 1, он должен перейти к более низкому условию, но продолжает переходить к верхнему условию.   -  person user2920000    schedule 28.10.2013


Ответы (1)


person    schedule
comment
Вы видите, что уровень ошибки изменен на 1 в приведенном выше журнале, но он все еще остается в if !errorlevel! == 0 условие. Что я пытаюсь сделать, так это не перезаписывать дубликаты файлов между областью сцены и областью процесса. Как только файлы обрабатываются, я перемещаю еще один. - person user2920000; 28.10.2013
comment
НЕТ. Команда Sleep сбрасывает уровень ошибки на 0. Это не обычная переменная. Он обновляется после каждого выполнения команды. Пакет выполняет sleep.exe, он не выдает ошибки, поэтому уровень ошибки равен 0. - person MC ND; 28.10.2013
comment
Вау, спасибо большое. Не могу поверить, что проблема была в чем-то столь маленьком. Я переместил sleep 3 в первую команду в операторе if, и все сработало отлично. - person user2920000; 28.10.2013
comment
Пояснение. Внешние команды всегда устанавливают ERRORLEVEL, независимо от успеха или неудачи. Внутренние команды в файлах .BAT устанавливают уровень ошибки только при ошибке — успех не сбрасывает ERROLEVEL на 0. Но внутренние команды в файлах .CMD всегда устанавливают уровень ошибки, даже если они выполнены успешно. - person dbenham; 28.10.2013