как получить параметры пакетного файла из N-й позиции? - PullRequest
15 голосов
/ 20 декабря 2008

Далее к Как передать параметры командной строки в пакетном файле как получить остальные параметры с указанием их точно? Я не хочу использовать SHIFT, потому что я не знаю, сколько может быть параметров, и хотел бы избежать их подсчета, если смогу.

Например, для данного пакетного файла:

@echo off
set par1=%1
set par2=%2
set par3=%3
set therest=%???
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%

Запуск mybatch opt1 opt2 opt3 opt4 opt5 ...opt20 даст:

the script is mybatch
Parameter 1 is opt1
Parameter 2 is opt2
Parameter 3 is opt3
and the rest are opt4 opt5 ...opt20

Я знаю, %* дает все параметры, но я не хочу первые три (например).

Ответы [ 4 ]

23 голосов
/ 20 декабря 2008

Вот как вы можете сделать это без использования SHIFT:

@echo off

for /f "tokens=1-3*" %%a in ("%*") do (
    set par1=%%a
    set par2=%%b
    set par3=%%c
    set therest=%%d
)

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%
1 голос
/ 01 марта 2018
@echo off
setlocal enabledelayedexpansion

set therest=;;;;;%*
set therest=!therest:;;;;;%1 %2 %3 =!

echo the script is %0
echo Parameter 1 is %1
echo Parameter 2 is %2
echo Parameter 3 is %3
echo and the rest are: %therest%

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

Пример вывода:

test_args.bat "1 1 1" 2 3 --a=b "x y z"
Parameter 1 is "1 1 1"
Parameter 2 is 2
Parameter 3 is 3
and the rest are: --a=b "x y z"

Это работает путем замены %1 %2 %3 в исходной командной строке %*. Первые пять точек с запятой служат только для того, чтобы заменить только первое вхождение этих %1 %2 %3.

1 голос
/ 10 сентября 2015
@ECHO OFF
SET REST=
::# Guess you want 3rd and on.
CALL :SUBPUSH 3 %*
::# ':~1' here is merely to drop leading space.
ECHO REST=%REST:~1%
GOTO :EOF

:SUBPUSH
SET /A LAST=%1-1
SHIFT
::# Let's throw the first two away.
FOR /L %%z in (1,1,%LAST%) do (
  SHIFT
)
:aloop
SET PAR=%~1
IF "x%PAR%" == "x" (
  GOTO :EOF
)
ECHO PAR=%PAR%
SET REST=%REST% "%PAR%"
SHIFT
GOTO aloop
GOTO :EOF

Мне нравится использовать подпрограммы вместо EnableDelayedExpansion. Выше приведена выдержка из моего пакета обработки шаблонов / файлов. Не говорите, что это не может обрабатывать аргументы с =, но, по крайней мере, может использовать путь в кавычках с пробелами и подстановочными знаками.

1 голос
/ 14 июля 2015

В следующем коде используется 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% в какой-либо другой командный или командный файл он будет проанализирован правильно.

Единственное ограничение, с которым я столкнулся до сих пор, относится к аргументам, содержащим символ вставки ^. Другие ограничения (связанные с <, >, |, &, ") применяются к самому интерпретатору командной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...