2012-09-27 255 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