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

ちょうど楽しみのために、内部の3つの 'FOR'ループを1行の' SET %% A&SET %% B&SET %% C'に置き換えることを検討してください。素晴らしい名前BTW。 –

5

は、値のペアが指定されているどのように多くのか、どのような順序名=気にしない興味深いソリューションです。そのトリックは、FOR/Fが各name = valueのペアを反復するように、各コンマを改行文字で置き換えることです。文字列に/という文字列が1つしかない限り、これは機能するはずです。それは選択的に、我々が興味を持っている唯一の名前=値のペアを解析することができます。また、変数が文字列から欠落している場合には、未定義の変数を初期化し、もう少しコードで

@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% 

@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!"の詳細を気に入っています。最初のものはなぜ終わりに '='があるのか​​理解しません。第2のものはそれに謎が〜あります。 – Kieveli

+0

小さなデータセットで動作しますが、24kアイテムのリストを照会しています。コマンド出力の割り当ては、バッチファイル変数の最大許容長より長く表示されます。 – Kieveli

+1

@Kieveli - はい、CMD.EXEで使用される環境変数は、最大長が約8191バイトに制限されています。 – dbenham