我有一个包含多个参数的批处理脚本。我正在读取它们的总数,然后像这样运行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 )
我现在要做的是使用我的运行变量(x
或counter
)来访问输入参数。我在想这样的事情:
REM Access to %1
echo %(!counter!)
在一个理想的世界中,这一行应该打印出我的第一个命令行参数,但显然它并没有。我知道我在使用%
运算符时出错了,但无论如何我可以访问这样的参数吗?
//编辑:只是为了清楚 - 问题是%(!counter!)
为我提供了变量counter
的值。 counter=2
的含义它给了我2
而不是%2
的内容。
答案 0 :(得分:42)
@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]!"
例如:
C:> test One "This is | the & second one" Third
Number of processed arguments: 3
1- "One"
2- "This is | the & second one"
3- "Third"
另一个:
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..."
答案 1 :(得分:14)
:loop
@echo %1
shift
if not "%~1"=="" goto loop
答案 2 :(得分:11)
这是访问第二个(例如)参数的一种方法(这可以放入for / l循环):
@echo off
setlocal enableDelayedExpansion
set /a counter=2
call echo %%!counter!
endlocal
这样:
setlocal enableDelayedExpansion
set /a counter=0
for /l %%x in (1, 1, %argCount%) do (
set /a counter=!counter!+1
call echo %%!counter!
)
endlocal
答案 3 :(得分:3)
如果要保持代码简短而不是明智,那么
for %%x in (%*) do (
echo Hey %%~x
)
答案 4 :(得分:2)
@ECHO OFF
SETLOCAL
SET nparms=0
FOR /l %%i IN (1,1,20) DO (
SET myparm=%%i
CALL :setparm %*
IF DEFINED myparm SET nparms=%%i&CALL ECHO Parameter %%i=%%myparm%%
)
ECHO there were %nparms% parameters in %*
GOTO :EOF
:setparm
IF %myparm%==1 SET myparm=%1&GOTO :EOF
shift&SET /a myparm -=1&GOTO setparm
GOTO :eof
这应该显示如何按位置提取随机参数。
答案 5 :(得分:1)
对于简单的迭代,我们不能只在代码末尾用“shift / 1”检查其他参数并循环回来吗?这将处理10个以上的参数,上限未经测试。
:loop
:: Your code using %1
echo %1
:: Check for further batch arguments.
shift /1
IF [%1]==[] (
goto end
) ELSE (
goto loop
)
:end
pause