Пакетное соответствие аргументов командной строки - PullRequest
2 голосов
/ 07 мая 2011

Я действительно не могу понять, почему это отказывается работать.

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

4 голосов
/ 08 мая 2011

Здесь есть несколько пунктов, которые требуют внимания:

  • Вы реализовали сценарии " сбой ", где THREE или TWO + THREE выполняются в 2 разных случаях,или ОДИН + ДВА + ТРИ в всех других случаях;
  • Я на самом деле не думаю, что операторы if работают так, как предполагалось: [%1%]==[1] должно быть либо [%1%]==[1%], либо [%1]==[1];
  • Если двойная обратная косая черта будет проблемой при запуске этого скрипта из корня, тогда рассмотрите возможность использования %__CD__%;
  • Все операторы if могут быть опущены, если вы просто используете goto batch%~1(или аналогичный) и переименуйте ваши ярлыки;ИЛИ
  • Все числовые метки можно опустить, если просто указать пакет для вызова в операторах 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 голос
/ 07 мая 2011

После того, как он переключится на ОДИН и выполнит вызов, он просто продолжит на следующей строке (ДВА).Метка не меняет последовательность выполнения, она все равно будет анализировать файл построчно, если только вы не перепрыгнете куда-либо.

Либо отскок к определенной точке:

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

:TWO
...

:DONE
pause

, либо конецпартия:

:ONE
call "%CURRDIR%\PlanningProduct.bat"
pause
GOTO :EOF
1 голос
/ 07 мая 2011

Производит ли нижеследующее то, что вы ожидаете?

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

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

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

:OUT
pause
...