2016-12-07 64 views
2

Предположим, что передаю некоторые аргументы из командной строки в пакетный скрипт. Нравится: myfile.bat flower, tree, doge, cate, house Но длина списка аргументов динамическая, а не 5 все время. Как я могу получить все аргументы от n до последнего. Например, если n было 2, что я должен писать, чтобы получить дож, кат, дом. Редактировать на основе вопроса комментариев.См. Все аргументы, переданные в командной строке из определенного индекса в конец - пакетный скрипт

+0

Каков реальный вопрос? Вам нужны последние аргументы 'n', fron' n' для 'last', или что? – elzooilogico

+0

Да, точно, от n до последнего – TBogdan

ответ

1
@ECHO OFF 
SETLOCAL 
SET /a skipargs=2 
SET "destvar=somevarname" 

CALL :getargs %* 

SET somevarname 

SET /a skipargs=1 
SET "destvar=somevarname" 

CALL :getargs %* 

SET somevarname 


GOTO :EOF 

:getargs 
IF %skipargs% gtr 0 SET /a skipargs-=1&shift&GOTO getargs 
SET "%destvar%=" 
:getargsl 
IF DEFINED %destvar% (CALL SET "%destvar%=%%%destvar%%% %1" 
) ELSE (
SET "%destvar%=%1" 
) 
SHIFT 
IF "%~1" neq "" GOTO getargsl 
GOTO :eof 

Это должно продемонстрировать, как назначить все арг после п-й к переменной.

0

попробовать

@echo off 

set/a skip=1 & rem set skip to the number of arguments to forget 
for /L %%i in (1,1,%skip%) do shift & rem skip arguments 

:getArg 
echo %~1 & shift 
if "%~1" neq "" goto :getArg 
exit/B  
+0

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество своей должности. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Также попробуйте не толковать код с пояснительными комментариями, что уменьшает читаемость кода и объяснений! – kayess

-2

Это кажется немного проще, (для меня по крайней мере).

@Echo Off 
Set "n=2" 
For /F "Tokens=%n%*" %%A In ("%*") Do Set "remainder=%%B" 
Echo(%remainder% 
Timeout -1 

Изменить значение переменной п на второй линии в соответствии с требованиями

+1

Я боюсь, что это неправильно аргументирует аргументы, поскольку 'for/F' не обрабатывает цитату' '' 'правильно; кроме того, существуют следующие разделители аргументов: * space *, * tab *, ',', ';', '=' и * неперерывное пространство * (код '0xFF') ... – aschipfl

+0

Не следует боюсь ... Мой ответ отлично работает с вопросом, я даже проверил предварительно отредактированную версию. Он также должен отлично работать с «цветком», «ree», «doge», ca; te, ho = use'. который, если я не ошибаюсь, означает, что ваш вышеупомянутый комментарий совершенно неверен, потому что он содержит как запятые. Я принимаю, что есть некоторые сценарии, где мой ответ не подходит, но он работает на 100% в пределах параметров вопроса. – Compo

+1

Ваш подход анализирует '' flo wer '' как два отдельных элемента - '' flo' и 'wer' '; однако 'cmd' считает' "flo wer" 'как один аргумент из-за цитаты; вот что я имел в виду; конечно, ваш код работает для примера вопроса, но он может не работать в реальных ситуациях ... – aschipfl

0

Ниже приведен вариант с использованием for петлю на %* (это отображает все, но первые _NUMSKIP аргументы):

@echo off 
set /A "_NUMSKIP=2" 
set /A "INDEX=0" 
for %%A in (%*) do (
    set /A "INDEX+=1" 
    setlocal EnableDelayedExpansion 
    if !INDEX! GTR %_NUMSKIP% (
     endlocal 
     echo(%%A 
    ) else endlocal 
) 

Обратите внимание, что это небезопасно для всех строк; например, аргумент &"&" вызывает синтаксическую ошибку!


Чтобы собрать оставшиеся аргументы в одной строке для последующей передачи в исполняемый файл, это помогает:

@echo off 
set /A "_NUMSKIP=2" 
set /A "INDEX=0" & set "ARGS= " 
for %%A in (%*) do (
    set /A "INDEX+=1" 
    set "ARGV=%%A" 
    setlocal EnableDelayedExpansion 
    if !INDEX! GTR %_NUMSKIP% (
     for /F "delims=" %%B in (^""!ARGS!!ARGV!"^") do (
      endlocal 
      set "ARGS=%%~B " 
     ) 
    ) else endlocal 
) 
setlocal EnableDelayedExpansion 
echo(!ARGS:~1,-1! 
endlocal 

Обратите внимание, что первоначальные аргументы разделители становятся заменены одним ПРОСТРАНСТВОМ каждыми.

+0

Это неправильно анализирует аргументы, посмотрите на этот «цветок», t; ree, «doge», ca; te, ho = use'. это выход «ree» doge «ca te ho use», где каждое пространство обозначает новую строку. Однако я не ожидаю, что все ответы будут работать отлично с любым набором неизвестных входных параметров. Кстати, два других ответа, использующих n = 2, также не работают с указанным выше вводом! – Compo

+0

@Compo, синтаксический анализ здесь верен, выходы 'echo' в отдельных строках - это просто показать аргументы; конечно, их можно вспомнить в одну переменную или вывести в одной строке - см. [отредактированный ответ] (http://stackoverflow.com/revisions/41018823/2) ... – aschipfl

+0

спасибо за (неоправданно) вниз -голос... – aschipfl

 Смежные вопросы

  • Нет связанных вопросов^_^