2011-12-22 2 views
-1

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

мой «эхо! Обрабатываются! Процесс» всегда дает мне правильный номер, но оператор IF просто не обрабатывает во второй раз

% ИСТИНА% и% ЛОЖЬ% являются глобальной переменной 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 
+0

я, наконец, использовал: ERRORCODES без setlocal, больше не используя его в качестве подпрограммы. Кажется, что подпрограмма, вызывающая другую подпрограмму, вообще не работает ... THX в любом случае! – Spaceballs

ответ

5

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 работы.)

+0

проблема не в истинном или ложном ... его оператор IF не работает. попытался поставить 0 вместо этого и все еще не работает. попробовал, если 0 == 0 тоже! также, как может работать оператор IF в первый раз, а НЕ второй раз ... – Spaceballs

1

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

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

У вас есть пространство между% выполнения% и &. Это пространство также будет находиться в значении%%%%. Так что в вашем заявлении, если это будет верно

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

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

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

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

Смежные вопросы