我的批处理脚本可能与嵌套块语法有关。
我有两个脚本:一个主脚本和一个启动脚本,以启动主脚本。两者分别命名为" 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:尝试延迟扩展后,这有效!请忽略之前的编辑。
答案 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%