2011-05-07 175 views
2

我真的不明白为什么拒绝工作。批处理命令行参数匹配

@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 . . . 

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

+0

什么是您预期的输出? – MartW 2011-05-07 09:45:20

回答

1

以下是否产生了您的期望?

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

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

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

:OUT 
pause 
+0

谢谢埃里克。这使得敏感和它的作品。我认为标签只能与goto一起使用。 – Nishant 2011-05-07 09:55:00

1

在它接到ONE并执行呼叫后,它将继续在下一行(TWO)。标签不会更改执行顺序,它仍然会逐行解析文件,除非您跳到某处。

要么跳开到一个特定的点:

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

:TWO 
... 

:DONE 
pause 

或结束该批次:

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

谢谢安德斯。我认为标签只能与goto一起使用。它现在有效 – Nishant 2011-05-07 09:55:24

4

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

  • 您已经实现了“ 下翻“情景,其中THREE或TWO + THREE在2个区别中执行ct case或ONE + TWO + THREE 全部其他情况;
  • 我其实不认为if声明按预期工作:[%1%]==[1]应该是[%1%]==[1%][%1]==[1];
  • 当此脚本从根目录运行时,如果双反斜杠成为问题,则考虑使用%__CD__%;
  • 如果您只使用goto batch%~1(或类似)并重命名标签,则可以省略所有if语句; 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