Ако приемем, че използваме скорошна версия на CMD тук, аз съм доста шокиран да открия, че никой не е публикувал следното, което позволява произволен брой аргументи да бъдат обработени лесно, без изобщо да се използва тромавата команда 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
редактиране – В случай, че някой обработва аргументи срещу друг списък и част от работата е вложена, важно е да се използва посредник 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
редактиране 2 - Освен това, ако по някаква причина искате да добавите подхода shift
към микса тук – може би като се опитате да предадете всички аргументи, различни от 1-ви, към подпрограма, като използвате shift
и след това използвате call :subroutine %*
– имайте предвид, че няма да работи, защото %*
всъщност ви дава всички оригинални аргументи в ред, без да знае каквото и да е преместване, което сте направили.
Жалко е, защото няма собствен синтаксис (за който знам), който може да групира всички аргументи след определен, както може да се очаква да направи %3*
.
person
Community
schedule
27.04.2015
SHIFT
позволява превключвател/N
да се използва заедно с него, за да изберете от кой аргумент да започнете. Например, ако сте използвали SHIFT за достъп до 10-ти аргумент, за да получите отново достъп до аргумент 0 (вашият абсолютен път към текущо изпълнявания пакетен скрипт), можете да използватеSHIFT /N 0
, който ви връща обратно към вашите оригинални аргументи 0-9. - person Anthony Miller   schedule 30.11.2011