首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在CMD批处理脚本中调用标签时,如何使用9个以上的参数?

在CMD批处理脚本中调用标签时,如何使用9个以上的参数?
EN

Stack Overflow用户
提问于 2011-11-30 23:25:16
回答 5查看 27.8K关注 0票数 29

我想知道在调用标签时如何在批处理脚本中调用9个以上的参数。例如,下面显示了我分配了12个参数,并尝试回显所有这些参数。

代码语言:javascript
运行
复制
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的输出最终为one0 one1 one2。我尝试过使用花括号、括号、引号、单引号将数字括起来,但都没有成功。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-30 23:44:19

如果要使用9个以上的参数,请使用shift command

(如果算上%0参数,实际上超过10个参数)

你可以...使用shift命令创建可接受10个以上批处理参数的批处理文件。如果在命令行上指定了10个以上的参数,则在第10个参数( %9 )之后出现的参数将一次一个移到%9中。

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

代码语言:javascript
运行
复制
@echo off
CALL:LABEL "one" "two" "three" "four" "five" "six" "seven" "eight" "nine" "ten" "eleven" "twelve"
PAUSE
GOTO:EOF

:LABEL
:: print arguments 1-9
echo %1
echo %2
echo %3
echo %4
echo %5
echo %6
echo %7
echo %8
echo %9

:: print arguments 10-11
shift
shift 
echo %8
echo %9

:: print argument 13
shift
echo %9

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

代码语言:javascript
运行
复制
@for /L %%i in (0,1,8) do shift
票数 32
EN

Stack Overflow用户

发布于 2015-04-27 11:26:54

假设我们在这里使用的是CMD的最新版本,我非常震惊地发现没有人发布以下内容,它允许在不使用笨拙的shift命令的情况下轻松处理任意数量的参数:

代码语言:javascript
运行
复制
rem test.bat
call :subr %*
exit /b

:subr
for %%A in (%*) do (
    echo %%A
)
exit /b

你也可以在"main“中做同样的事情。

这样,在处理参数时就不会耗尽参数,也不需要shift,这意味着如果有复杂的调用选项,您可以多次循环访问参数列表,而这恰好使脚本的逻辑更简单。

显然,如果循环超过一次,就会增加计算复杂度,以换取易读性,但Bash和CMD都不是为提高速度而构建的(据我所知),因此在假设n小于100左右的情况下,尝试通过设置all- in -go进行优化几乎没有意义。

以下是一些示例输出:

代码语言:javascript
运行
复制
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设置为一个空字符串,所以接下来最简单的做法是:

代码语言:javascript
运行
复制
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 %*将第一个以外的所有参数传递给子例程-请注意,it 不会工作在中,因为%*实际上给了你所有原始参数的顺序,而不知道你所做的任何转换。

这很遗憾,因为没有本机语法(据我所知)可以将所有参数分组到某个参数之后,正如人们可能会期望%3*所做的那样。

票数 8
EN

Stack Overflow用户

发布于 2013-11-07 18:25:48

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

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

代码语言:javascript
运行
复制
@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
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8328338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档