Предположим, что передаю некоторые аргументы из командной строки в пакетный скрипт. Нравится: myfile.bat flower, tree, doge, cate, house
Но длина списка аргументов динамическая, а не 5 все время. Как я могу получить все аргументы от n до последнего. Например, если n было 2, что я должен писать, чтобы получить дож, кат, дом. Редактировать на основе вопроса комментариев.См. Все аргументы, переданные в командной строке из определенного индекса в конец - пакетный скрипт
См. Все аргументы, переданные в командной строке из определенного индекса в конец - пакетный скрипт
ответ
@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
Это должно продемонстрировать, как назначить все арг после п-й к переменной.
попробовать
@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
Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество своей должности. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Также попробуйте не толковать код с пояснительными комментариями, что уменьшает читаемость кода и объяснений! – kayess
Это кажется немного проще, (для меня по крайней мере).
@Echo Off
Set "n=2"
For /F "Tokens=%n%*" %%A In ("%*") Do Set "remainder=%%B"
Echo(%remainder%
Timeout -1
Изменить значение переменной п на второй линии в соответствии с требованиями
Я боюсь, что это неправильно аргументирует аргументы, поскольку 'for/F' не обрабатывает цитату' '' 'правильно; кроме того, существуют следующие разделители аргументов: * space *, * tab *, ',', ';', '=' и * неперерывное пространство * (код '0xFF') ... – aschipfl
Не следует боюсь ... Мой ответ отлично работает с вопросом, я даже проверил предварительно отредактированную версию. Он также должен отлично работать с «цветком», «ree», «doge», ca; te, ho = use'. который, если я не ошибаюсь, означает, что ваш вышеупомянутый комментарий совершенно неверен, потому что он содержит как запятые. Я принимаю, что есть некоторые сценарии, где мой ответ не подходит, но он работает на 100% в пределах параметров вопроса. – Compo
Ваш подход анализирует '' flo wer '' как два отдельных элемента - '' flo' и 'wer' '; однако 'cmd' считает' "flo wer" 'как один аргумент из-за цитаты; вот что я имел в виду; конечно, ваш код работает для примера вопроса, но он может не работать в реальных ситуациях ... – aschipfl
Ниже приведен вариант с использованием 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
Обратите внимание, что первоначальные аргументы разделители становятся заменены одним ПРОСТРАНСТВОМ каждыми.
Это неправильно анализирует аргументы, посмотрите на этот «цветок», t; ree, «doge», ca; te, ho = use'. это выход «ree» doge «ca te ho use», где каждое пространство обозначает новую строку. Однако я не ожидаю, что все ответы будут работать отлично с любым набором неизвестных входных параметров. Кстати, два других ответа, использующих n = 2, также не работают с указанным выше вводом! – Compo
@Compo, синтаксический анализ здесь верен, выходы 'echo' в отдельных строках - это просто показать аргументы; конечно, их можно вспомнить в одну переменную или вывести в одной строке - см. [отредактированный ответ] (http://stackoverflow.com/revisions/41018823/2) ... – aschipfl
спасибо за (неоправданно) вниз -голос... – aschipfl
Каков реальный вопрос? Вам нужны последние аргументы 'n', fron' n' для 'last', или что? – elzooilogico
Да, точно, от n до последнего – TBogdan