Подтвердить что ты не робот

Параметры партии: все после% 1

Дубликат:

Разъяснение: Я знал о циклическом подходе - это работало даже до Command Extensions; Я надеялся на что-то забавное и недокументированное, как% ~ * 1 или что-то еще, - как и те, которые описаны в http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true.


В пакетном файле Windows (с включенными так называемыми "Расширениями команд" ) первый аргумент% 1,% 2 - второй и т.д.% * - все конкатенированные аргументы.

Мой вопрос: есть ли способ получить все ПОСЛЕ% 2, например?

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

4b9b3361

Ответ 1

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

@echo off
set RESTVAR=
shift
:loop1
if "%1"=="" goto after_loop
set RESTVAR=%RESTVAR% %1
shift
goto loop1

:after_loop
echo %RESTVAR%

Сообщите мне, если это поможет!

Ответ 2

Существует более короткое решение (однострочный), использующий возможности токенирования для циклов for:

:: all_but_first.bat
echo all: %*
for /f "tokens=1,* delims= " %%a in ("%*") do set ALL_BUT_FIRST=%%b
echo all but first: %ALL_BUT_FIRST%

выход:

> all_but_first.bat foo bar baz
all: foo bar baz
all but first: bar baz

Ответ 3

Вы можете использовать SHIFT для этого. Он удаляет% 1 и сдвигает все остальные аргументы ниже. Этот script выводит все аргументы после% 2 (поэтому он выводит% 3,% 4...), пока один из них не будет пустым (так он последний):

@echo off

SHIFT
SHIFT

:loop
if "%1" == "" goto end
echo %1
SHIFT
goto loop

:end

EDIT: Удаленный пример с использованием% *, так как это не работает -% * всегда выводит все параметры

Ответ 4

Следующее будет работать для args с ", =, ' ' (по сравнению с ответом @MaxTruxa)

echo %*
set _all=%*
call set _tail=%%_all:*%2=%%
set _tail=%2%_tail%
echo %_tail%

Тест

> get_tail.cmd "first 1" --flag="other options" --verbose
"first 1" --flag="other options" --verbose
--flag="other options" --verbose

Ответ 5

Основываясь на ответе schnaader, я думаю, что это делается, если вы хотите все после того, как% 1 конкатенирован.

@echo off

SHIFT

set after1=

:loop
if "%1" == "" goto end
set after1=%after1% %1
SHIFT
goto loop


:end

echo %after1%

Ответ 6

Следующие аргументы будут работать для args с ", =,". На основании ответа Дмитрия Соколова. Исправлена ​​проблема, когда второй arg совпадает с первым аргументом.

@echo off
echo %*
set _tail=%*
call set _tail=%%_tail:*%1=%%
echo %_tail%