如果声明第一次工作,但不是第二次

时间:2011-12-22 20:49:08

标签: if-statement batch-file dos

我遇到此问题 **如果未处理==%true%**
问题是当它不应该停留在循环中 我尝试了IF处理的其他方式==%false%它进入循环但是不会在第二次返回。有时候,最多可进行3次。

我的“echo!processed!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 个答案:

答案 0 :(得分:5)

1)我没有看到您定义TRUEFALSE的位置 - 它们肯定不是标准批量值。

如果您尝试设置充当布尔标志的变量,那么我建议如下。

要将标记设置为false,请使用SET "FLAG="。这个“取消定义”旗帜。

要将标志设置为true,请使用SET "FLAG=1。请注意,值1没有意义。只要它不是空的,你就可以使用任何值。

要测试标志是否为true,请使用IF DEFINED FLAG ECHO FLAG IS TRUE

要测试标志是否为假,请使用IF NOT DEFINED FLAG ECHO FLAG IS FALSE

我喜欢这种技术的原因是DEFINED在执行时评估,而不是在解析时评估。因此,在任何代码块中使用此测试是安全的,例如在FOR循环中,并且您不必担心延迟扩展。

2)我没有费心去追踪你的逻辑。如果您能够提供最少量的代码来证明问题,那将是一件好事。

3)如果您在其他地方使用了ECHO OFF,请尝试在IF之前设置ECHO ON,以便您可以看到批处理脚本尝试执行的操作。

(我想也许您错过了SETLOCAL EnableDelayedExpansion,但现在我看到echo !processed! process的报告正常工作。)

答案 1 :(得分:1)

您的子程序似乎不起作用的原因是因为您在其中犯了一点错误。

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

%execute%和&之间有空格。 该空间也将在%processed%变量的值中。 所以在你的if语句中这将是真的

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

要避免在%processed%变量中占用此空间,请使用此

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

这也记录在SS64