Если утверждение работает в первый раз, но не во второй раз - PullRequest
0 голосов
/ 23 декабря 2011

У меня проблема с ** ЕСЛИ НЕ обработано ==% true% **.
Проблема в том, что он остается в цикле, когда не должен.
Iпопробовал наоборот если обработан ==% false% он идет в цикле НО не возвращается во второй раз.иногда это происходит до 3 раз.

мой «echo! processing! process» всегда дает мне правильный номер, но оператор IF просто не обрабатывает второй раз около

%TRUE% AND% FALSE% являются глобальной переменной 1 и 0

   setlocal  
    :loopapp  
    **if not '!processed!'=='%TRUE%'** (  
        set /a count+=1
        "%ProgramFiles%\abc\abc.exe" !file! !post!  
        call :ERRORCODES !file! !post! !ERRORLEVEL! !count!  
        goto :loopapp  
    )
    endlocal

:ERRORCODES
setlocal
if %errornum% LEQ 99 (  
    set no_license=%FALSE%  
    if '!post!'== 'A' set no_license=%TRUE%  

    if '!no_license!'=='%TRUE%' (
            echo    Searching ... '!count!' ... Please Wait ...
            if !count! EQU 5 (
                set execute=%TRUE%
                set succes=%FALSE%
                echo %~n1 - Fatal - process %TIME% >> %tempfolder%\errorlog.txt
                goto :END
            )  
            set execute=%FALSE%  
            set succes=%FALSE%  
            goto :out_errorcodes  
    )
    set execute=%TRUE%
    set succes=%FALSE%
    echo %~n1 - Fatal - process %TIME% >> %tempfolder%\errorlog.txt  
    goto :out_errorcodes 
)  

... other errors  

:out_errorcodes  
endlocal & set processed=%execute% & set fait=%succes%  
goto :EOF

Ответы [ 2 ]

5 голосов
/ 23 декабря 2011

1) Я не вижу, где вы определяете, что такое TRUE и FALSE - они, безусловно, не являются стандартными пакетными значениями.

Если вы пытаетесь установить переменные, которые функционируют как логические флаги, то я рекомендую следующее.

Чтобы установить флаг в значение false, используйте SET "FLAG=". Это «не определяет» флаг.

Чтобы установить флаг в значение true, используйте SET "FLAG=1. Обратите внимание, что значение 1 не имеет значения. Вы можете использовать любое значение, если оно не пустое.

Чтобы проверить, является ли флаг истинным, используйте IF DEFINED FLAG ECHO FLAG IS TRUE

Чтобы проверить, является ли флаг ложным, используйте IF NOT DEFINED FLAG ECHO FLAG IS FALSE

Причина, по которой мне нравится эта техника, в том, что DEFINED оценивается во время выполнения, а не во время разбора. Поэтому этот тест можно безопасно использовать в любом блоке кода, например в цикле FOR, и вам не нужно беспокоиться о задержке расширения.

2) Я не удосужился попытаться проследить вашу логику. Было бы хорошо, если бы вы могли найти минимальный объем кода, который демонстрирует проблему.

3) Если вы использовали ECHO OFF в другом месте, попробуйте включить ECHO ON непосредственно перед IF, чтобы вы могли видеть, что пытается сделать пакетный скрипт.

(я думал, что, возможно, вам не хватает SETLOCAL EnableDelayedExpansion, но теперь я вижу ваш отчет о том, что echo !processed! process работает.)

1 голос
/ 14 марта 2013

Причина, по которой ваша подпрограмма не работает, в том, что вы допустили в ней небольшую ошибку.

endlocal & set processed=%execute% & set fait=%succes%

У вас есть пробел между% execute% и &. Это пространство также будет в значении переменной% processing%. Так что в вашем утверждении if это будет верно

'!processed!'=='%TRUE% '

Чтобы избежать наличия этого пробела в% обработанной% переменной, используйте это

endlocal & set processed=%execute%& set fait=%succes%

Это также задокументировано SS64

...