在CMD批处理脚本中调用标签时,如何利用超过9个参数?

我想知道如何在调用标签时在批处理脚本中调用超过9个参数。 例如,下面的例子显示我有12个参数,试图回显所有的参数。

CALL:LABEL "one" "two" "three" "four" "five" "six" "seven" "eight" "nine" "ten" "eleven" "twelve" PAUSE GOTO:EOF :LABEL echo %1 echo %2 echo %3 echo %4 echo %5 echo %6 echo %7 echo %8 echo %9 echo %10 echo %11 echo %12 

%10%11和%12的输出结果是1个one1。 我已经尝试使用大括号,括号,引号,单引号周围的数字没有任何运气。

有这个shift命令 。

你可以使用一个循环,在移位之前存储变量,或者像这样快速完成:

 CALL:LABEL "one" "two" "three" "four" "five" "six" "seven" "eight" "nine" "ten" "eleven" "twelve" PAUSE GOTO:EOF :LABEL echo %1 echo %2 echo %3 echo %4 echo %5 echo %6 echo %7 echo %8 echo %9 shift shift shift echo %7 echo %8 echo %9 

如果你有很多参数,你可以用一个循环替换shift命令。 下面的for循环执行九次shift ,所以%1将是第十个参数。

 @for /L %%i in (0,1,8) do shift 

这是使用shift命令的另一种方法。

请注意,在这种情况下,您可以使用可变数量的参数。

 @ECHO OFF CALL:LABEL "one" "two" "three" "four" "five" "six" "seven" "eight" "nine" "ten" "eleven" "twelve" PAUSE GOTO:EOF :LABEL echo %1 shift if not [%1]==[] GOTO LABEL 

假设我们在这里使用了CMD的最新版本,我感到非常震惊的是,没有人发布以下内容,它允许任意数量的参数被轻松处理,而无需使用笨重的shift命令:

 rem test.bat call :subr %* exit /b :subr for %%A in (%*) do ( echo %%A ) exit /b 

你也可以在“main”中做同样的技巧。

这样,当你处理它们的时候,你不会吃掉你的论点,而且需要shift ,这意味着如果你有复杂的调用选项,你可以不断地循环遍历参数列表,并且恰好使你的脚本的逻辑简单。

显然,如果不止一次地循环,它会增加计算的复杂性以换取可读性,但是Bash和CMD都不是真正以极高的速度建造的(据我所知),所以没有必要试图通过优化假设n小于100左右,设置all-in-one-go。

一些示例输出:

 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方法到混合中,可能试图通过使用shift ,然后使用call :subroutine %* ,将除1st之外的所有参数传递给子call :subroutine %* ,请注意将无法正常工作,因为%*实际上给了你所有的原始论点,不知道你所做的任何转变。
这是一个耻辱,因为没有本地语法(我知道),可以将所有参数分组一个之后 ,正如人们所期望的那样, %3*做。

批处理文件中不能有超过10个(0到9)可访问的参数(%0是批处理文件本身)。 但是,使用shift命令可以让你“左移”你的论点,并且可以访问超越第九个论点的论点。 如果你这样做了三次,最后应该包含包含“十”,“十一”和“十二”的%7,%8和%9。

只要把它戴在戒指上,如果有帮助的话

 Set a=%1 & Set b=%2 & Set c=%3 & Set d=%4 & Set e=%5 & Set f=%6 & Set g=%7 & Set h=%8 & Set i=%9 Shift & Shift & Shift & Shift & Shift & Shift & Shift & Shift & Shift Set j=%1 & Set k=%2 & Set l=%3 & Set m=%4 & Set n=%5 & Set o=%6 & Set p=%7 & Set q=%8 & Set r=%9 Shift & Shift & Shift & Shift & Shift & Shift & Shift & Shift & Shift Set s=%1 & Set t=%2 & Set u=%3 & Set v=%4 & Set w=%5 & Set x=%6 & Set y=%7 & Set z=%8 

我只是把这个放在.bat或子程序的顶部,它将使用> 9个参数,然后你可以使用%a%%z%而不是%1到不存在的%26

这很丑陋,原来我只有一条线

 Set a=%1 & Shift & Set b=%1 & Shift &... 

这样,它只能在一行上,很快就会隐藏在编辑器的边缘,但是直到下一行才会生效。 所有的变量都被设置为第一个参数。

如果你想知道为什么要这样做,而不是循环,除非有人给我看,你可以创建一个映射或数组,我需要在一行命令中使用变量,而不是echo (或做任何事情)与他们一一次:

 ::example; concatenate a bunch of files Set output=%1 Shift <insert above behemoth> type %a% %b% %c% %d% %e% %f% 2>NUL > %output% 

该死的这个在bash中要容易得多

 cat ${@:2} > "$1"