我想知道如何在调用标签时在批处理脚本中调用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的输出结果是one 0 one 1 one 2。我试过在数字周围使用花括号、方括号、引号和单引号,但没有任何效果。
7条答案
按热度按时间pkbketx91#
如果要使用9个以上的参数,请使用
shift
command。(如果算上
%0
参数,实际上超过10个参数)您可以[...]使用shift命令创建一个可以接受10个以上批处理参数的批处理文件。如果您在命令行上指定了10个以上的参数,则出现在第十个(%9)之后的参数将一次一个地移入%9。
你可以使用一个循环,在移位之前存储变量,或者像这样快速完成:
如果你有很多参数,你可以用一个循环来代替shift命令。下面的for循环执行
shift
九次,所以%1
将是第十个参数。piztneat2#
如果能帮到谁我就来试试
我只是把它放在
.bat
或子例程的顶部,它将使用〉9个参数,然后你可以使用%a%
到%z%
,而不是%1
到不存在的%26
。很难看,本来我都是一条一条的
这样,它就只在一行上,并很快隐藏在编辑器的边缘,但显然
Shift
要到下一个真正的行才生效;所有变量都被设置为第一个参数。如果你想知道为什么要这样做而不是循环,除非有人告诉我你可以创建一种Map或数组,我需要在一行命令中使用变量,而不是
echo
(或其他)一次一个:该死的这在bash里容易多了
clj7thdc3#
这是使用
shift
命令的另一种方式。请注意,在这种情况下,您可以使用可变数量的参数。
odopli944#
假设我们在这里使用的是CMD的最新版本,我很震惊地发现没有人发布以下内容,它允许轻松处理任意数量的参数,而无需使用笨重的
shift
命令:你也可以在“main”中使用同样的技术。
这样,你就不会在处理参数时吃掉它们,也不需要
shift
,这意味着如果你有复杂的调用选项,你可以不断地循环参数列表多次,这恰好使你的脚本逻辑更简单。显然,如果 do 循环不止一次,它会增加计算复杂度,以换取可读性,但无论是Bash还是CMD都不是真正为高速而构建的(据我所知),因此,假设 n 小于100左右,尝试通过设置所有功能来优化几乎没有意义。
一些示例输出:
CALL
来允许正在处理的当前参数被转移到内部循环中是很重要的;简单地执行set intermediary=%%OUTER
似乎只是将intermediary
设置为一个空字符串,所以接下来最简单的是这样做:shift
方法添加到这里的混合中-也许通过使用shift
然后使用call :subroutine %*
尝试将除第一个参数之外的所有参数传递给子例程-请注意,它不会工作因为%*
实际上按顺序提供了所有原始参数,不知道你做过什么改变这是一个遗憾,因为没有原生语法(据我所知)可以将所有参数分组在某个参数 * 之后 *,就像人们可能期望的
%3*
那样。huwehgph5#
在批处理文件中不能有超过10个(0到9)可访问的参数(%0是批处理文件本身)。但是,使用
shift
命令将允许您“左移”参数,并访问第9个参数以外的参数。如果您这样做三次,您应该最终得到包含“ten”,“eleven”和“twelve”的%7,%8和%9。bmp9r5qi6#
我知道这个旧的,但我想我会为其他人更新谷歌搜索。
对于任何好奇的人,我创建了一个很好的动态和紧凑的方法来完成这一点,所以你可以有一个可变数量的参数。
kkk's answer can work as well
请让我知道,如果有人有任何改进.我尝试使用以下也接受的方法.但对于使用这种方法的人,并试图做一些疯狂的事情,我喜欢有超过27个参数,这是行不通的.它停止后27.或者至少这是我所经历的,让我知道,如果你有过其他的经历.
flseospp7#
Hashbrown有一个完美的简单的答案,在SETting变量上移动10..n,Polymath有一个完美的评论如何避免尾随空格(&技巧)。
这就是我的答案,设置1..18个参数,避免空格,并删除输入参数中的
"my param value X"
引号(~技巧)。