batch file fails to set variable in IF clause

后端 未结 1 1374
野性不改
野性不改 2020-12-30 09:26

The following code is not updating Run to equal N even though the match occurs. this means I\'m not dropping into the CALL code. Am i missing something here?



        
相关标签:
1条回答
  • 2020-12-30 10:03

    You need to use the delayed expansion option of cmd.exe.

    At the top of your script, put:

    setlocal enableextensions enabledelayedexpansion
    

    and then put:

    endlocal
    

    at the bottom.

    Then you need to use !Run! instead of %Run%.

    The reason your code is not working is that the entire FOR statement (including the commands within it) is evaluated when it's encountered. That's the point where the %Run% variables are expanded.

    By using deferred expansion, you don't expand them until they're actually needed (after you've set them within the block).

    You can see the difference in this script:

    @echo off
    setlocal enableextensions enabledelayedexpansion
    
    set xx=0
    for %%i in (a b c d) do (
        echo %%i
        set /a "xx = xx + 1"
        if %xx%==3 echo yes for normal
        if !xx!==3 echo yes for delayed
    )
    
    endlocal
    

    which outputs:

    a
    b
    c
    yes for delayed
    d
    

    You'll notice that the check with %xx% does not work because that was evaluated when the for statement started (and xx was 0). The delayed-expansion !xx! does work since that is evaluated each time through the loop.

    0 讨论(0)
提交回复
热议问题