批处理脚本 - 通过参数迭代

Tob*_*oby 32 arguments loops batch-file command-line-arguments

我有一个包含多个参数的批处理脚本.我正在读取它们的总数,然后像这样运行for循环:

@echo off
setlocal enabledelayedexpansion

set argCount=0
for %%x in (%*) do set /A argCount+=1
echo Number of processed arguments: %argCount%

set /a counter=0
for /l %%x in (1, 1, %argCount%) do (
set /a counter=!counter!+1 )
Run Code Online (Sandbox Code Playgroud)

我现在想做的是使用我的运行变量(xcounter)来访问输入参数.我在想这样的事情:

REM Access to %1 
echo %(!counter!)
Run Code Online (Sandbox Code Playgroud)

在理想的世界中,这一行应该打印出我的第一个命令行参数,但显然它没有.我知道我对%操作员做错了什么,但无论如何我可以访问我这样的论点吗?

//编辑:只是为了清楚 - 问题在于它%(!counter!)为我提供了变量的值counter.counter=2它的意义给了我2而不是内容%2.

Aac*_*ini 47

@echo off
setlocal enabledelayedexpansion

set argCount=0
for %%x in (%*) do (
   set /A argCount+=1
   set "argVec[!argCount!]=%%~x"
)

echo Number of processed arguments: %argCount%

for /L %%i in (1,1,%argCount%) do echo %%i- "!argVec[%%i]!"
Run Code Online (Sandbox Code Playgroud)

例如:

C:> test One "This is | the & second one" Third
Number of processed arguments: 3
1- "One"
2- "This is | the & second one"
3- "Third"
Run Code Online (Sandbox Code Playgroud)

另一个:

C:> test One Two Three Four Five Six Seven Eight Nine Ten Eleven Twelve etc...
Number of processed arguments: 13
1- "One"
2- "Two"
3- "Three"
4- "Four"
5- "Five"
6- "Six"
7- "Seven"
8- "Eight"
9- "Nine"
10- "Ten"
11- "Eleven"
12- "Twelve"
13- "etc..."
Run Code Online (Sandbox Code Playgroud)


Jay*_*lor 17

:loop
@echo %1
shift
if not "%~1"=="" goto loop
Run Code Online (Sandbox Code Playgroud)

  • 更好的答案在哪里?我喜欢这个,因为它非常简洁,简洁,直白. (5认同)
  • 我认为@jeb想要说的是,您应该提供答案的解释。我认为这很棒,但是有了每个命令的作用的详细信息,也许还有用法示例,您将获得更多支持:) (3认同)

npo*_*aka 12

这是访问第二个(例如)参数的一种方法(这可以放入for/l循环):

@echo off
setlocal enableDelayedExpansion
set /a counter=2
call echo %%!counter!
endlocal
Run Code Online (Sandbox Code Playgroud)

所以:

setlocal enableDelayedExpansion
set /a counter=0
for /l %%x in (1, 1, %argCount%) do (
 set /a counter=!counter!+1
 call echo %%!counter! 
)
endlocal
Run Code Online (Sandbox Code Playgroud)

  • 此方法不适用于数字9以外的参数 (4认同)
  • 我做了一个愚蠢的错误(与我的文件名有点混淆,让我们不要谈论它:-) ^^) - 立即工作 - 即将测试它嵌入我的整个脚本 (2认同)

h22*_*h22 6

如果要使代码简短而不是明智,那么

for %%x in (%*) do (
   echo Hey %%~x 
)
Run Code Online (Sandbox Code Playgroud)

  • @isapir 如果参数之一包含 `*`,这种方法将会失败,正如我刚刚学到的困难方法一样。 (4认同)