Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 在CMD批处理脚本中调用标签时,如何使用9个以上的参数?_Windows_Batch File_Command Line Arguments - Fatal编程技术网

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

Windows 在CMD批处理脚本中调用标签时,如何使用9个以上的参数?,windows,batch-file,command-line-arguments,Windows,Batch File,Command Line Arguments,我想知道在调用标签时如何在批处理脚本中调用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

我想知道在调用标签时如何在批处理脚本中调用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的输出结果为one0 one1 one2。我已经尝试过在数字周围使用大括号、大括号、引号和单引号,但运气不好。

批处理文件中的可访问参数不能超过10个(0到9个)(%0是批处理文件本身)。但是,使用
shift
命令将允许您“左移”参数,并访问第9个参数以外的参数。如果您这样做三次,您应该得到包含“十”、“十一”和“十二”的%7、%8和%9。

如果您想使用更多的9个参数,请使用。
(如果将
%0
参数计算在内,实际上超过10个参数)

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

您可以使用循环,在移位前存储变量,也可以像这样快速执行:

@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
将是第十个参数

@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

假设我们在这里使用的是最新的ish版本的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

编辑-如果有人正在处理针对另一个列表的参数,并且部分工作是嵌套的,则必须使用中间
调用
来允许当前正在处理的参数传输到内部循环中;简单地执行
set intermediate=%%OUTER
似乎只是简单地将
intermediate
设置为空字符串,因此下面最简单的操作是:

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%*
尝试将除第一个参数以外的所有参数传递给子例程-请注意将不起作用,因为
%*
实际上提供了所有参数原创性的论点井然有序,对你所做的任何转变一无所知
这是一个遗憾,因为没有本地语法(据我所知)可以将所有参数分组在某个参数之后,正如人们可能期望的那样,可以说
%3*
这样做。

如果有人需要,就扔我的帽子吧

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
班次&班次&班次&班次&班次&班次&班次&班次
集合j=%1&集合k=%2&集合l=%3&集合m=%4&集合n=%5&集合o=%6&集合p=%7&集合q=%8&集合r=%9
班次&班次&班次&班次&班次&班次&班次&班次
集s=%1&集t=%2&集u=%3&集v=%4&集w=%5&集x=%6&集y=%7&集z=%8
我只是把它放在
.bat
或将使用>9个参数的子例程的顶部,然后您可以通过
%z%
使用
%a%
,而不是
%1
来使用不存在的
%26

这很难看,最初我一行就搞定了

设置a=%1&Shift&设置b=%1&Shift&。。。
这样,它只在一行上,很快就被隐藏在编辑器的边缘后面,但显然
Shift
在下一行真正出现之前不会生效;所有变量都设置为第一个参数

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

::示例;连接一组文件
设置输出=%1
移位
键入%a%%b%%c%%d%%e%%f%2>NUL>%output%
该死,这在bash里容易多了

cat${@:2}>“$1”

我想补充一点,
SHIFT
允许将
/N
开关与之结合使用,以选择从哪个参数开始。例如,如果使用SHIFT访问第10个参数,为了再次访问参数0(当前正在运行的批处理脚本的绝对路径),可以使用
SHIFT/N 0
,将您重置回原始的0-9参数。的可能重复,但在本例中%7、%8、%9引用的是较旧的值,而不是“10”,“十一”等等……请看