批处理命令行参数匹配

时间:2011-05-07 09:41:11

标签: batch-file command-line

我真的不明白为什么这会拒绝工作。

@ECHO OFF


    SET CURRDIR=%CD%


    if [%1%]==[1] GOTO ONE 
    if [%1%]==[2] GOTO TWO 
    if [%1%]==[3] GOTO THREE


    :ONE
    call "%CURRDIR%\PlanningProduct.bat"

    :TWO
    call "%CURRDIR%\Organization.bat"

    :THREE
    call "%CURRDIR%\Measure.bat"

    pause

我在命令行中执行了以下操作

I:\BatchMania>I:\BatchMania\Home.bat 1

我得到的输出很有趣如下:

Planning
Organization
Measure
Press any key to continue . . .

这很奇怪。希望永远不要写这种代码!!!

3 个答案:

答案 0 :(得分:4)

这里有几个需要注意的事项:

  • 您已实施“直通”方案,其中三个或两个+三个在两个不同的情况下执行,或者在所有其他情况下执行一个+两个+三个;
  • 我实际上并不认为if语句按预期工作:[%1%]==[1]应为[%1%]==[1%][%1]==[1];
  • 从根运行此脚本时,双重反斜杠是否应该成为问题,请考虑使用%__CD__%;
  • 如果您只使用if(或类似名称)并重命名标签,则可以省略所有goto batch%~1语句; OR
  • 如果您只是在if语句中指定要调用的批处理和/或使用if-else构造,则可以省略所有数字标签。

以下是一些替代实施方案:

@ECHO OFF
set CURRDIR=%CD%
goto :BATCH%~1 2>NUL
goto :UHOH

:BATCH1
call "%CURRDIR%\PlanningProduct.bat"
goto :DONE

:BATCH2
call "%CURRDIR%\Organization.bat"
goto :DONE

:BATCH3
call "%CURRDIR%\Measure.bat"
goto :DONE

:UHOH
echo Invalid parameter "%~1"

:DONE
pause

@ECHO OFF
set CURRDIR=%CD%

if "%~1"=="1" (
    call "%CURRDIR%\PlanningProduct.bat"
) else if "%~1"=="2" (
    call "%CURRDIR%\Organization.bat"
) else if "%~1"=="3" (
    call "%CURRDIR%\Measure.bat"
) else (
    echo Invalid parameter "%~1"
)
pause

@ECHO OFF
set CURRDIR=%CD%

set BAT=
if "%~1"=="1" set BAT=PlanningProduct.bat
if "%~1"=="2" set BAT=Organization.bat
if "%~1"=="3" set BAT=Measure.bat
call "%CURRDIR%\%BAT%" 2>NUL
pause

答案 1 :(得分:1)

以下产生的是您所期望的吗?

:ONE
call "%CURRDIR%\PlanningProduct.bat"
GOTO OUT

:TWO
call "%CURRDIR%\Organization.bat"
GOTO OUT

:THREE
call "%CURRDIR%\Measure.bat"

:OUT
pause

答案 2 :(得分:1)

跳到ONE并执行调用之后,它将继续在下一行(TWO)继续。标签不会改变执行顺序,它仍然会逐行解析文件,除非你跳到某个地方。

跳到特定点:

...
:ONE
call "%CURRDIR%\PlanningProduct.bat"
GOTO DONE

:TWO
...

:DONE
pause

或结束批次:

:ONE
call "%CURRDIR%\PlanningProduct.bat"
pause
GOTO :EOF