В следующем коде используется shift
, но он избегает синтаксического анализа командной строки с помощью for
и позволяет интерпретатору командной строки выполнять эту работу (учитывая, что for
не обрабатывает двойные кавычки должным образом, например, набор аргументов экземпляра) A B" "C
интерпретируется как 3 аргумента A
, B"
, "C
как for
, но как интерпретатор интерпретирует как 2 аргумента A
, B" "C
, это предотвращает цитируемые аргументы пути, такие как "C:\Program Files\"
, от обрабатывается правильно):
@echo off
set "par1=%1" & shift /1
set "par2=%1" & shift /1
set "par3=%1" & shift /1
set therest=
set delim=
:REPEAT
if "%1"=="" goto :UNTIL
set "therest=%therest%%delim%%1"
set "delim= "
shift /1
goto :REPEAT
:UNTIL
echo the script is "%0"
echo Parameter 1 is "%par1%"
echo Parameter 2 is "%par2%"
echo Parameter 3 is "%par3%"
echo and the rest are "%therest%"
rem.the additional double-quotes in the above echoes^
are intended to visualise potential whitespaces
Остальные аргументы в %therest%
могут не выглядеть так, как они изначально относились к разделителям (помните, что интерпретатор командной строки также рассматривает TAB, ,
, ;
, =
как разделители, а также все комбинации ), потому что все разделители здесь заменяются одним пробелом. Однако при передаче %therest%
в какой-либо другой командный или командный файл он будет проанализирован правильно.
Единственное ограничение, с которым я столкнулся до сих пор, относится к аргументам, содержащим символ вставки ^
. Другие ограничения (связанные с <
, >
, |
, &
, "
) применяются к самому интерпретатору командной строки.