2012-09-27 257 views
9

我有以下字符串:解析字符串

MyProject/Architecture=32bit,BuildType=Debug,OS=winpc

我希望能够抓住值32位,调试和winpc并将其存储在名为架构,BuildType变量, OS在批处理脚本中稍后引用。我通常是Unix家伙,所以这对我来说是一个新的领域。任何帮助将不胜感激!

回答

24

这应做到:

FOR /F "tokens=1-6 delims==," %%I IN ("MyProject/Architecture=32bit,BuildType=Debug,OS=winpc") DO (
    ECHO I %%I, J %%J, K %%K, L %%L, M %%M, N %%N 
) 
REM output is: I MyProject/Architecture, J 32bit, K BuildType, L Debug, M OS, N winpc 

FOR循环是一个非常有趣的一件机器。在控制台中输入FOR /?以获得它可以做的一些疯狂的事情的描述。

+0

16秒,更干净!今天我的选票超出了现在的想象的+1;以后再投票。 – LittleBobbyTables

3

尝试以下操作:

@ECHO OFF 

SET Var=MyProject/Architecture=32bit,BuildType=Debug,OS=winpc 

FOR /F "tokens=1,2,3 delims=," %%A IN ("%Var%") DO (
    FOR /F "tokens=1,2 delims==" %%D IN ("%%A") DO (
     SET Architecture=%%E 
    ) 
    FOR /F "tokens=1,2 delims==" %%D IN ("%%B") DO (
     SET BuildType=%%E 
    ) 
    FOR /F "tokens=1,2 delims==" %%D IN ("%%C") DO (
     SET OS=%%E 
    ) 
) 

ECHO %Architecture% 
ECHO %BuildType% 
ECHO %OS% 

PAUSE 
+4

只是为了好玩,考虑用单行'SET %% A&SET %% B&SET %% C'替换你的三个内部'FOR'循环。伟大的名字BTW。 –

5

这里是不关心有多少或什么样的顺序名称=值指定对一个有趣的解决方案。诀窍是用换行符替换每个逗号,以便FOR/F将迭代每个名称=值对。只要字符串中只有一个/,这应该工作。

@echo off 
setlocal enableDelayedExpansion 
set "str=MyProject/Architecture=32bit,BuildType=Debug,OS=winpc" 

::Eliminate the leading project info 
set "str=%str:*/=%" 

::Define a variable containing a LineFeed character 
set LF=^ 


::The above 2 empty lines are critical - do not remove 

::Parse and set the values 
for %%A in ("!LF!") do (
    for /f "eol== tokens=1,2 delims==" %%B in ("!str:,=%%~A!") do set "%%B=%%C" 
) 

::Display the values 
echo Architecture=%Architecture% 
echo BuildType=%BuildType% 
echo OS=%OS% 

带着几分更多的代码,它可以选择性地分析出,我们感兴趣的只是name = value对,并初始化的变量不确定的情况下,该变量从字符串中缺少。

@echo off 
setlocal enableDelayedExpansion 
set "str=MyProject/Architecture=32bit,BuildType=Debug,OS=winpc" 

::Eliminate the leading project info 
set "str=%str:*/=%" 

::Define a variable containing a LineFeed character 
set LF=^ 


::The above 2 empty lines are critical - do not remove 

::Define the variables we are interested in 
set "vars=Architecture BuildType OS" 

::Clear any existing values 
for %%A in (%vars%) do set "%%A=" 

::Set the values 
for %%A in ("!LF!") do (
    for /f "eol== tokens=1,2 delims==" %%B in ("!str:,=%%~A!") do (
    for %%D in (%vars%) do if "%%B"=="%%D" set "%%B=%%C" 
) 
) 

::Display the values 
for %%A in (%vars%) do echo %%A=!%%A! 
+0

这看起来很神奇,而且不可理解。我很想知道“%str =%str:*/=%”和“!str:,= %%〜A!”的更多细节。第一个没有意义,为什么最后有一个'=',第二个有一个谜。 – Kieveli

+0

适用于较小的数据集,但我现在正在查询24k项目的列表,并且命令输出的分配看起来比批处理文件变量的最大允许长度更长。 – Kieveli

+1

@Kieveli - 是的,CMD.EXE使用的环境变量被限制为最大长度约8191字节。 – dbenham