Вы можете зациклить аргументы, используя 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
...
UPDATE (адресованослучай, когда у параметра есть собственный аргумент)
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"
...