Предполагая, что мы используем недавно выпущенную версию CMD, я очень шокирован, обнаружив, что никто не опубликовал следующее, что позволяет легко обрабатывать произвольное количество аргументов, даже не используя clunky shift
команда:
rem test.bat
call :subr %*
exit /b
:subr
for %%A in (%*) do (
echo %%A
)
exit /b
Вы также можете сделать эту же технику прямо в "main".
Таким образом, вы не съедаете свои аргументы при их обработке, и вам не нужно shift
, то есть вы можете последовательно просматривать список аргументов более одного раза, если у вас есть сложные параметры вызова и случается, чтобы сделать логику вашего скрипта проще.
Очевидно, что если do повторяется более одного раза, это увеличивает вычислительную сложность в обмен на удобочитаемость, но ни Bash, ни CMD действительно не были созданы для большой скорости (насколько я когда-либо слышал), поэтому нет смысла пытаться оптимизировать, выполняя настройку «все в одном», предполагая, что n меньше 100 или около того.
Пример вывода:
C:\tmp>test.bat one two three four five six seven eight nine ten eleven
one
two
three
four
five
six
seven
eight
nine
ten
eleven
edit - Если кто-то обрабатывает аргументы против другого списка, и часть работы вложена, важно использовать посредника CALL
, чтобы разрешить передачу текущего обрабатываемого аргумента во внутренний цикл; простое выполнение set intermediary=%%OUTER
, по-видимому, просто устанавливает intermediary
на пустую строку, так что это проще всего сделать следующим образом:
setlocal enabledelayedexpansion
rem ^ in my experience, it's always a good idea to set this if for-loops are involved
for /f %%L in (file.txt) do (
call :inner %%L
)
exit /b
:inner
for %%A in (%*) do (
if %%A EQU %~1 call dosomething.bat %~1
)
exit /b
edit 2 - Кроме того, если по какой-либо причине вы хотите добавить сюда подход shift
в микс - возможно, пытаясь передать все аргументы, кроме первого, в подпрограмму с помощью shift
, а затем с помощью call :subroutine %*
- обратите внимание, что не будет работать , потому что %*
фактически выдает все исходные аргументы по порядку, не обращая внимания на любые изменения, которые вы сделали.
Обидно, потому что нет собственного синтаксиса (который я знаю), который мог бы сгруппировать все аргументы после определенного, как можно было бы ожидать, скажем, %3*
.