windows - hvordan man håndterer indlejret hvis blokke i BATCH scripts?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et problem med mit batch script, der sandsynligvis er relateret til genstartede syntax.


Jeg har to scripts: et hovedskript og et startskript for at starte den primære. Begge er henholdsvis navngivet 'script.bat' og 'start.bat' til eksemplet.


Under scripts (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


Her er de forventede resultater (Det skal spørge tre Windows-konsoller som nedenfor.)


Første konsol:


RESULT = C [exit code: 0]

Press any key to continue...


Anden konsol:


RESULT = NULL [exit code: 1]

Press any key to continue...


Tredje konsol:


Skipped!

Press any key to continue...


I stedet for det har jeg fejlen nedenfor i hver af de tre konsoller:


set was unexpected at this time.


Tak for din hjælp og beklager, hvis min engelsk er unøjagtig undertiden.


Hav en god dag. :)


EDIT: Dette problem synes ikke at være relateret til de forsinkede udvidelser, fordi vi har en syntaksfejl her. Et problem med forsinket ekspansion skal føre til et forkert resultat i stedet for, men ikke en syntaksfejl som i mit eksempel.


EDIT 2: efter at have forsøgt med forsinkede udvidelser, det fungerede! Vær venlig at se bort fra den tidligere redigering.

Bedste reference


Som aschipfl sagde, var det et problem relateret til de forsinkede udvidelser.


Her er det arbejdende 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

Andre referencer 1


Den store kodeblok if \%bool\%==true ( er ikke nødvendig, hvis du lægger

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

foran (forudsat bool skal enten være sandt eller falsk)

Alle dine IF-kommandoer savner /I ignore casing-omskifteren.


Jeg omstrukturerer partiet og undgår nødvendigheden af ​​DelayedExpansion

Du kan bruge findstr til at kontrollere indtastninger for validitet.


:: Q:Test201857SO\_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\%