如何处理BATCH脚本中的嵌套if块?

时间:2018-05-07 15:41:16

标签: windows batch-file if-statement syntax nested

我的批处理脚本可能与嵌套块语法有关。

我有两个脚本:一个主脚本和一个启动脚本,以启动主脚本。两者分别命名为" script.bat"和" start.bat"例如。

脚本(MCVE)下方:

script.bat

@echo off
set init="%1"
set bool=%2
set switch=%3
if %bool%==true (
    set var=%init:"=%
    set check=false
    if "%switch%"=="I" (
        if "%var%"=="A" set check=true
        if "%var%"=="B" set check=true
        if "%var%"=="C" set check=true
        if "%var%"=="D" set check=true
        if "%var%"=="E" set check=true
        if "%var%"=="F" set check=true
        if "%var%"=="G" set check=true
    )
    if "%switch%"=="II" (
        if "%var%"=="A" set check=true
        if "%var%"=="B" set check=true
        if "%var%"=="C" set check=true
        if "%var%"=="D" set check=true
        if "%var%"=="E" set check=true
    )
    if "%switch%"=="III" (
        if "%var%"=="A" set check=true
        if "%var%"=="B" set check=true
        if "%var%"=="C" set check=true
        if "%var%"=="D" set check=true
        if "%var%"=="E" set check=true
        if "%var%"=="F" set check=true
    )
    if %check%==false set code=1
    if %check%==true set code=0
    if %check%==true set result=%var%
)
if %bool%==false echo Skipped!
if %bool%==false goto quit
if defined result (
    echo RESULT = %result% [exit code: %code%]
) else (
    echo RESULT = NULL [exit code: %code%]
)
:quit
echo.
pause
exit

的start.bat

@echo off
start script.bat C true II
start script.bat F true II
start script.bat B false I

这是预期的结果(它应该提示三个Windows控制台,如下所示。)

第一个控制台:

RESULT = C [exit code: 0]

Press any key to continue...

第二个控制台:

RESULT = NULL [exit code: 1]

Press any key to continue...

第三个控制台:

Skipped!

Press any key to continue...

而不是这样,我在以下三个控制台中都有以下错误:

set was unexpected at this time.

感谢您的帮助,对不起,如果我的英语有时不准确。

祝你有个愉快的一天。 :)

编辑:此问题似乎与延迟扩展无关,因为我们在这里有语法错误。 A"延迟扩张"相关问题应该会导致错误的结果,但不会出现像我的例子中的语法错误。

编辑2:尝试延迟扩展后,这有效!请忽略之前的编辑。

2 个答案:

答案 0 :(得分:0)

正如aschipfl所说,这是一个与延迟扩展有关的问题。

这是工作script.bat:

@echo off
set init="%1"
set bool=%2
set switch=%3
setlocal enabledelayedexpansion
if %bool%==true (
    set var=%init:"=%
    set check=false
    if "%switch%"=="I" (
        if "!var!"=="A" set check=true
        if "!var!"=="B" set check=true
        if "!var!"=="C" set check=true
        if "!var!"=="D" set check=true
        if "!var!"=="E" set check=true
        if "!var!"=="F" set check=true
        if "!var!"=="G" set check=true
    )
    if "%switch%"=="II" (
        if "!var!"=="A" set check=true
        if "!var!"=="B" set check=true
        if "!var!"=="C" set check=true
        if "!var!"=="D" set check=true
        if "!var!"=="E" set check=true
    )
    if "%switch%"=="III" (
        if "!var!"=="A" set check=true
        if "!var!"=="B" set check=true
        if "!var!"=="C" set check=true
        if "!var!"=="D" set check=true
        if "!var!"=="E" set check=true
        if "!var!"=="F" set check=true
    )
    if !check!==false set code=1
    if !check!==true set code=0
    if !check!==true set result=!var!
)
if %bool%==false echo Skipped!
if %bool%==false goto quit
if defined result (
    echo RESULT = %result% [exit code: %code%]
) else (
    echo RESULT = NULL [exit code: %code%]
)
:quit
endlocal
echo.
pause
exit

答案 1 :(得分:0)

如果你加上,那么大代码块if %bool%==true (根本不是必需的 if %bool%==false (echo Skipped! & goto quit)
在前面(假设bool应该是真或假)
所有IF命令都会错过/I忽略套管开关。

我重组批次并避免延迟扩展的必要性 您可以使用findstr检查条目的有效性。

:: Q:\Test\2018\05\07\SO_50217905.cmd
@echo off
set "init=%~1"
set bool=%2

:: check bool for valid content
Echo:%bool%|findstr /i "true false" >Nul 2>&1 || (Echo wrong bool value&goto quit)

set switch=%3
Echo:%switch%|findstr /i "II*" >Nul 2>&1 || (Echo wrong switch value&goto quit)

if /i %bool%==false (echo Skipped! & goto quit )

set "var=%init:~0,1%"
set check=false

if "%switch%"=="I"   Echo:ABCDEFG|findstr /i "%var%" >NUL 2>&1 && set check=true
if "%switch%"=="II"  Echo:ABCDE|  findstr /i "%var%" >NUL 2>&1 && set check=true
if "%switch%"=="III" Echo:ABCDEF| findstr /i "%var%" >NUL 2>&1 && set check=true

if /i %check%==false set code=1
if /i %check%==true (set code=0 & set result=%var%)

if defined result (
    echo RESULT = %result% [exit code: %code%]
) else (
    echo RESULT = NULL [exit code: %code%]
)
:quit
echo.
pause
exit /B %code%