2015-11-19 35 views
2

我有一个字符串"-a valueA -b valueB -c valueC",我想用bat来分隔这个字符串的空格并解析值“-a”“valueA”“-b”“valueB”“-c”和“valueC”一个接一个。循环字符串分隔空间

基本上,我想使用for循环来实现这一点,但是bat中的for循环似乎比我想像的要复杂得多。

我试过下面的代码,但显然它不起作用。

set TEST_CODE="-a valueA -b valueB -c valueC" 
for /f "tokens=* delims= " %%a in (%TEST_CODE%) do (
    echo %%a 
) 

我期待的输出为

-a  
valueA  
-b 
valueB 
-c 
valueC 

我指的this link,但我仍然感到困惑,究竟是tokensdelims这里。一些蝙蝠专家可以分享一些想法吗?

+0

_TAB_是否也允许作为分隔符?那么',',';'和'='呢? – aschipfl

回答

3

下面介绍一种方法。调用递归子例程。最后一行并不是真的需要,但是为了安全起见,我把它放在那里(如果你想在上面注释'if ... goto ...'行)。通过解释,您可以调用传递整个字符串的子例程。它剥离第一个标记并使用字符串的其余部分自行调用,直到字符串为空。

@echo off 
call :GetToken "-a valueA -b valueB -c valueC" 
pause 
goto :eof 

:GetToken 
for /f "tokens=1*" %%a in ("%~1") do (
    echo(%%a 
    if "%%b"=="" goto :eof 
    call :GetToken "%%b" 
) 
goto :eof 
+0

谢谢:)那么'tokens = 1 *'是什么意思?为什么我们使用'%〜1'而不是'%1'?对于第一个循环,如果'%% a'代表'-a',那么'%% b'代表'valueA'或'valueA -b valueB -c valueC'? – hackjutsu

+0

标记1 *表示1是第一个标记,*是该行的其余部分。 %〜1删除了引号......是的,引号将它们放回去,但这样你就不需要考虑字符串是否被引用(可能是从多个地方调用的......一些引用的有些则不)。 %% b表示字符串的其余部分。 – RGuggisberg

2

两种选择适合你。

set TEST_CODE=-a valueA -b valueB -c valueC 
for /f "tokens=1-6 delims= " %%a in ("%TEST_CODE%") do ( 
    echo %%a 
    Echo %%b 
    echo %%c 
    Echo %%d 
    Echo %%e 
    Echo %%f 
) 

或者

set TEST_CODE=-a valueA -b valueB -c valueC 
for %%a in (%TEST_CODE%) do echo %%a 

既然你选择了答案多一个选择是调用一个函数。

call :loop -a valueA -b valueB -c valueC 
pause 
goto :eof 

:loop 
IF NOT "%1"=="" (
    echo %~1 
    SHIFT 
    GOTO loop 
) 
GOTO :EOF 
+0

第一个选项依赖于字符串总是由6个标记组成的假设;第二个使用_SPACE_,_TAB_,',',';'和'='作为分隔符...... – aschipfl

+0

@aschipfl,实际上第二个选项由于SET命令中的引号而不能以当前形式工作。大声笑! – Squashman

+0

第二种解决方案对我无效。它在for循环语句中将'(%TEST_CODE%)''更改为'(“%TEST_CODE%”)''时有效,尽管'-a'变为'“”a','valueC'变为'valueC“ 。 – hackjutsu