Пакетные параметры: все после% 1 - PullRequest
32 голосов
/ 01 июня 2009

Дубликат:

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


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

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

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

Ответы [ 7 ]

31 голосов
/ 04 ноября 2014

Существует более короткое решение (однострочное), использующее возможности токенизации циклов 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
19 голосов
/ 01 июня 2009

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

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

:after_loop
echo %RESTVAR%

Дайте мне знать, если это поможет!

6 голосов
/ 30 апреля 2017

Следующее будет работать для аргументов с ", =, ' ' (по сравнению с ответом @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 голосов
/ 30 августа 2017

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

@echo off
echo %*
set _tail=%*
call set _tail=%%_tail:*%1=%%
echo %_tail%
4 голосов
/ 01 июня 2009

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

@echo off

SHIFT
SHIFT

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

:end

РЕДАКТИРОВАТЬ: Удален пример с использованием% *, поскольку это не работает -% * всегда выводит все параметры

1 голос
/ 11 июля 2018

Себи, вот синтаксис ! Существует поведение, в котором есть символы равенства, которые не заключаются в двойные кавычки, это вызывает проблемы в приведенных выше сценариях. Если вы не хотите пропустить, я сделал модификацию, основанную на ответе Рамана Жилича и strlen.cmd:

@ECHO OFF
SETLOCAL enableDelayedExpansion

SET _tail=%*
SET "_input="
SET /A _len=0

:again
SET "_param=%1"
SET "_input=%_input%%1"
FOR /L %%i in (0,1,8191) DO IF "!_param:~%%i,1!"=="" (
    REM skip param
    SET /A _len+=%%i
    REM _len can't be use in substring
    FOR /L %%j in (!_len!,1,!_len!) DO (
        REM skip param separator
        SET /A _len+=1
        IF "!_tail:~%%j,1!"=="=" (SET "_input=%_input%=" & SHIFT & goto :again)
    )
) & goto :next
:next
IF %_len% NEQ 0 SET _tail=!_tail:~%_len%!

ENDLOCAL & SET "_input=%_input%" & SET "_tail=%_tail%"
1 голос
/ 01 июня 2009

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

@echo off

SHIFT

set after1=

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


:end

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