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

li9yvcax  于 2023-04-07  发布在  Windows
关注(0)|答案(7)|浏览(206)

我想知道如何在调用标签时在批处理脚本中调用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。我试过在数字周围使用花括号、方括号、引号和单引号,但没有任何效果。

pkbketx9

pkbketx91#

如果要使用9个以上的参数,请使用shift command
(如果算上%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
piztneat

piztneat2#

如果能帮到谁我就来试试

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 &...

这样,它就只在一行上,并很快隐藏在编辑器的边缘,但显然Shift要到下一个真正的行才生效;所有变量都被设置为第一个参数。
如果你想知道为什么要这样做而不是循环,除非有人告诉我你可以创建一种Map或数组,我需要在一行命令中使用变量,而不是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"
clj7thdc

clj7thdc3#

这是使用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
odopli94

odopli944#

假设我们在这里使用的是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
  • edit* -万一有人正在处理另一个列表的参数,并且部分工作是嵌套的,那么使用一个中间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
  • edit 2* -此外,如果出于任何原因,您想要将shift方法添加到这里的混合中-也许通过使用shift然后使用call :subroutine %*尝试将除第一个参数之外的所有参数传递给子例程-请注意,它不会工作因为%*实际上按顺序提供了所有原始参数,不知道你做过什么改变

这是一个遗憾,因为没有原生语法(据我所知)可以将所有参数分组在某个参数 * 之后 *,就像人们可能期望的%3*那样。

huwehgph

huwehgph5#

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

bmp9r5qi

bmp9r5qi6#

我知道这个旧的,但我想我会为其他人更新谷歌搜索。
对于任何好奇的人,我创建了一个很好的动态和紧凑的方法来完成这一点,所以你可以有一个可变数量的参数。

SETLOCAL ENABLEDELAYEDEXPANSION
:ARG
set /A Count+=1
echo !Count!
if "%~1"=="" (
    GOTO ENDARGS
) else (
    <Do Something, call variables with !VarName! instead of %VarName%>
)
shift
GOTO ARG
:ENDARGS
ENDLOCAL

kkk's answer can work as well
请让我知道,如果有人有任何改进.我尝试使用以下也接受的方法.但对于使用这种方法的人,并试图做一些疯狂的事情,我喜欢有超过27个参数,这是行不通的.它停止后27.或者至少这是我所经历的,让我知道,如果你有过其他的经历.

for %%a in (%*) do (
    <Do Something>
)
flseospp

flseospp7#

Hashbrown有一个完美的简单的答案,在SETting变量上移动10..n,Polymath有一个完美的评论如何避免尾随空格(&技巧)。
这就是我的答案,设置1..18个参数,避免空格,并删除输入参数中的"my param value X"引号(~技巧)。

@rem must shift 10..n input params, avoid whitespaces by using "~1& .."
@set p1=%~1& set p2=%~2& set p3=%~3& set p4=%~4& set p5=%~5& set p6=%~6& set p7=%~7& set p8=%~8& set p9=%~9
@Shift & Shift & Shift & Shift & Shift & Shift & Shift & Shift & Shift
@set p10=%~1& set p11=%~2& set p12=%~3& set p13=%~4& set p14=%~5& set p15=%~6& set p16=%~7& set p17=%~8& set p18=%~9

相关问题