开发者

Batch command line argument matching

I really can't understand why this refuses to work.

@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 did the following in the command line

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

and the output I get is funny as follows:

Planning
Organiza开发者_Python百科tion
Measure
Press any key to continue . . .

This is weird. Hope to never write this kind of code!!!


There are several items that need attention here:

  • You have implemented "fall-through" scenarios, where THREE or TWO+THREE is executed in 2 distinct cases, or ONE+TWO+THREE in all other cases;
  • I actually do not think the if statements work as intended: [%1%]==[1] should either be [%1%]==[1%] or [%1]==[1];
  • Should double backslashes be a problem when this script is run from the root, then consider using %__CD__%;
  • All if statements can be omitted if you just use goto batch%~1 (or similar) and rename your labels; OR
  • All number labels can be omitted if you just specify the batch to call in the if statements and/or use if-else constructs.

Here are some alternative implementations:

@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


Does the below produce what you expect?

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

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

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

:OUT
pause


After it junps to ONE and executes the call, it is just going to continue on the next line (TWO). A label does not change the execution sequence, it is still going to parse the file line by line unless you jump somewhere.

Either jump away to a specific point:

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

:TWO
...

:DONE
pause

or end the batch:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜