Параметры партии: все после% 1
Дубликат:
Разъяснение: Я знал о циклическом подходе - это работало даже до Command Extensions; Я надеялся на что-то забавное и недокументированное, как% ~ * 1 или что-то еще, - как и те, которые описаны в http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true.
В пакетном файле Windows (с включенными так называемыми "Расширениями команд" ) первый аргумент% 1,% 2 - второй и т.д.% * - все конкатенированные аргументы.
Мой вопрос: есть ли способ получить все ПОСЛЕ% 2, например?
Я не мог найти такую вещь, и это было бы полезно для чего-то, над чем я работаю.
Ответы
Ответ 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%