Как бороться с вложенными блоками if в скриптах BATCH? - PullRequest
0 голосов
/ 07 мая 2018

У меня проблема с моим пакетным скриптом, вероятно, связанная с синтаксисом вложенных блоков.

У меня есть два сценария: основной сценарий и сценарий запуска, чтобы запустить основной. Оба примера соответственно называются «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.

Спасибо за вашу помощь и извините, если мой английский иногда неточен.

Хорошего дня. :)

РЕДАКТИРОВАТЬ: эта проблема, кажется, не связана с отложенными расширениями, потому что здесь есть синтаксическая ошибка. Проблема, связанная с «отложенным расширением», должна привести к неверному результату, а не к синтаксической ошибке, как в моем примере.

РЕДАКТИРОВАТЬ 2: после попытки с отложенными расширениями, это работает! Пожалуйста, не обращайте внимания на предыдущее редактирование.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Большой кодовый блок if %bool%==true ( совсем не нужен, если вы поставите
if %bool%==false (echo Skipped! & goto quit)
впереди (при условии, что bool должен быть либо true, либо false)
Все ваши команды IF пропускают /I игнорирующий переключатель кожуха.

Я бы реструктурировал партию и избежал необходимости в DelayedExpansion
Вы можете использовать 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%
0 голосов
/ 07 мая 2018

Как сказал aschipfl, это была проблема, связанная с отложенными расширениями.

Вот рабочий скрипт.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...