Пакетный файл для цикла через переключаемые аргументы?

Я пытаюсь перебрать аргументы, которые я передаю в пакетный файл. Основываясь на аргументе, я хочу установить флаг переменной true или false для последующего использования в сценарии.

Итак, моя команда "myscript.bat /u /p /s"

И мой код:

FOR /f %%a IN ("%*") DO (
  IF /I "%%a"=="/u" SET UPDATE=Y
  IF /I "%%a"=="/p" SET PRIMARY=Y
  IF /I "%%a"=="/s" SET SECONDARY=Y
)

Это работает, только если у меня есть один аргумент, который говорит мне, что он получает весь список аргументов как один аргумент. Я пробовал "delims=", но безрезультатно. Любые мысли о получении каждого разнесенного аргумента?


Как насчет добавления значения к одному из параметров?

myscript.bat /u /p /d ТЕСТ /s

:loop
IF "%~1"=="" GOTO cont
IF /I "%~1"=="/u" SET UPDATE=Y
IF /I "%~1"=="/p" SET PRIMARY=Y
IF /I "%~1"=="/s" SET SECONDARY=Y
IF /I "%~1"=="/d" SHIFT & SET DISTRO="%~1"
SHIFT & GOTO loop

:cont

Но SHIFT, который появляется вместе с последним оператором IF, на самом деле ничего не меняет. DISTRO заканчивается "/d" вместо "TEST"


person DssTrainer    schedule 09.03.2011    source источник


Ответы (2)


Вы можете перебрать аргументы, используя SHIFT, GOTO и дополнительный IF, чтобы проверить, нет ли больше параметров для анализа:

:loop
IF "%~1"=="" GOTO cont
IF /I "%~1"=="/u" SET UPDATE=Y
IF /I "%~1"=="/p" SET PRIMARY=Y
IF /I "%~1"=="/s" SET SECONDARY=Y
SHIFT & GOTO loop

:cont
...

ОБНОВЛЕНИЕ (устранение случая, когда параметр имеет собственный аргумент)

SHIFT в операторе IF, который проверяет /d, работает. Проблема в том, что вся строка оценивается сразу, и оба экземпляра %~1 заменяются одним и тем же значением, которое в этот момент равно /d.

Таким образом, в основном решением в этом случае было бы заставить интерпретатор оценивать часть SET DISTRO="%~1" отдельно от части IF /I "%~1"=="/d". К этому могут быть разные подходы. Например, вы можете просто переместить SHIFT & SET DISTRO="%~1" на следующую строку и пропустить ее, если %~1 не /d:

...
IF /I NOT "%~1"=="/d" GOTO skip_d
SHIFT & SET "DISTRO=%~1"
:skip_d
...

Другой метод может состоять в том, чтобы присвоить специальное значение (например, ?) для DISTRO и сдвинуть, когда встретится /d. Затем в следующей строке проверьте, имеет ли DISTRO это специальное значение, и установите для него значение %~1:

...
IF /I "%~1"=="/d" SHIFT & SET DISTRO=?
IF "%DISTRO%"=="?" SET "DISTRO=%~1"
...
person Andriy M    schedule 09.03.2011
comment
Спасибо! Думаю, я слишком много думал. - person DssTrainer; 09.03.2011

Вы не так уж далеки от исходной части, и, поскольку мне не нравятся циклы GOTO, я решил опубликовать это:

FOR %%a IN (%*) DO (
  IF /I "%%a"=="/u" SET UPDATE=Y
  IF /I "%%a"=="/p" SET PRIMARY=Y
  IF /I "%%a"=="/s" SET SECONDARY=Y
)

Причина, по которой он работал только с одним параметром, заключается в чрезмерном использовании кавычек. Поместив %* в кавычки, вы сделали всю командную строку одним токеном. Кроме того, вариант FOR с /F — это не то, что вы искали. Документация доступна из FOR /? должно помочь прояснить ситуацию.

person MarbleMunkey    schedule 17.10.2012