变量循环和批处理文件中的参数之间的不同行为,参数不能在循环中传递

时间:2012-12-07 01:37:33

标签: batch-file arguments

我试图将批处理文件参数解压缩为3个字符串。我首先尝试使用变量然后将其拆分为3(分隔符是空格):

代码:

@echo off
set var=\s v4.12 1,2,3,4
for /f "tokens=1,2,3 delims= " %%a in ("%var%") do (
echo a is %%a, b is %%b, c is %%c
)

结果:

a is \s, b is v4.12, c is 1,2,3,4

但是当我尝试将var实现为参数时:

新代码:

@echo off
for /f "tokens=1,2,3 delims= " %%a in ("%1") do (
echo a is %%a, b is %%b, c is %%c
)

执行:

test.bat \s v4.12 1,2,3,4

结果:

a is /s, b is , c is

我尝试打开回声并发现该参数未在循环中传递,我该如何解决?

========== 编辑(这是对Aacini的回答):

我目前的代码:

for /f "tokens=1-3" %%a in ("%*") do (
echo First is %%a, Second is %%b, Third is %%c
:loopers
for /f "tokens=* delims=," %%d in ("%%c") do (
echo %%d
shift
if not  "%%d"=="" (
goto :loopers else exit >nul
)
)
)

获得第三个令牌(%% c等于1,2,3,4)之后我必须再次创建一个循环以使用逗号作为分隔符来获取每个数字但是当我尝试时,它会无限地显示%c (不是值,而是实际的%c文本)

结果如下:

First is /s, Second is v1.4, Third is 1,2,3,4
1
%c
..infinite loop of %c..

1 个答案:

答案 0 :(得分:2)

对不起,我想我不明白你的问题。

您想要执行此行:

test.bat /s v1.1 1,3,4,5

和3个标记中的单独参数:“/ s”,“v1.1”,“1,3,4,5” OR 6个标记中的单独参数:“/ s”,“ v1.1“”1“,”3“,”4“,”5“

如果你想要第一个案例,那么这段代码就是这样做的:

@echo off
for /f "tokens=1-3" %%a in ("%*") do (
echo First is %%a, Second is %%b, Third is %%c
)

如果您想要第二种情况,那么每个参数在%1到%6可替换参数中已经可用:

echo First is %1, Second is %2, Third is %3, Fourth is %4, Fifth is %5, Sixth is %6

如果这些解决方案都不适合您,请以非常简洁的方式解释您想要的内容! (不要混淆或把其他案例作为例子,只要把“我想要这个......”)

编辑: 作为回复新信息的新答案

请您,您必须意识到我了解您要查看的示例。因为你没有说出你想要的东西我只能猜测,所以我们再来一次......

1-如果你想分开3个标记中的参数:“/ s”,“v1.1”和“1,3,4,5”,我已经通过%% a,%%显示了如何做到这一点b和%% c可替换参数。

2-如果你想分离6个标记中的参数:“/ s”,“v1.1”“1”,“3”,“4”和“5”并且可以访问所有这些参数同时,您可以使用%1 ..%6批参数。

3-如果要在任意数量的令牌中分隔参数 (在本例中为6)并逐个处理 ,请使用以下代码:

:nextParam
   if "%1" equ "" goto endParams
   echo %1
   shift
   goto nextParam
:endParams

4-如果你想第一个分开3个代币中的参数:“/ s”,“v1.1”和“1,3,4,5”,以及然后< / em>进一步将第三个令牌(%% c)分成四部分,然后我无法理解这可能是什么目的。但是,仅出于说明目的,这是这样做的方法:

for /f "tokens=1-3" %%a in ("%*") do (
   echo First is %%a, Second is %%b, Third is %%c
   for %%d in (%%c) do echo %%d
)

5-如果你想在3个变量中存储 3个参数,并在第3个变量中删除逗号,请使用:

for /f "tokens=1-3" %%a in ("%*") do (
   set First=%%a
   set Second=%%b
   set Third=%%c
)
set Third=%Third:,= %

我强烈建议您阅读您使用的批处理命令的说明(通过HELP command),然后使用您不理解的任何内容。请注意,复制您不理解的代码,修改它然后询问“为什么我的代码不起作用?”是胡说八道。最好就具体的疑问提出具体问题。

如果上述5点中没有一个是您想要的,那么如果您没有向我们解释您想要的东西(使用文字,而不是通过代码示例),我们就无法再帮助您了...

安东尼奥