2011-12-13 3 views
14

私はfoo:bar:bazのような文字列を持っているとします。この文字列をループすることは可能ですか?ファイルの行をトークン化できるように見えましたが、以下の例は 'foo'を1回だけエコーします。文字列のトークンをループする方法は?

for /f "tokens=1,2* delims=:" %%x in ("%%j") do echo %%x

答えて

16
set string=foo:bar:baz 
for %%x in (%string::= %) do echo %%x 

FOR ...あなたがかもしれない、...、

for /f "tokens=* delims=:" %%x in ("foo:bar:baz") do (
    echo %%x 
    echo %%y 
    echo %%z 
) 

%%xをあなたは可能性がある処理または事前にあなたが得たどのように多くの項目がわからない場合区切り文字は、スペース、コンマ、セミコロン、等号とすることができます。要素がこれらの文字のいずれかで区切られている場合、文字列を直接処理することができます。そうでない場合は、これらの文字の区切り文字を変更してください(上記のように)。

set string=foo bar,baz;one=two 
for %%x in (%string%) do echo %%x 
+0

+1簡単に! –

2

予想通りそれは、それは%%x%%y%%zにそれをトークン化ありません。だから、代わりにちょうど

@echo off 
set string=foo:bar:baz 
:again 
for /f "tokens=1* delims=:" %%x in ("%string%") do (
    echo %%x 
    set string=%%y 
) 
if not .%string%==. goto again 
echo done 
+0

うーん、私は私が何をしたいと思いますが、ファイル内の行をループ私ができるようにトークンをループすることができることですA。これを行うには良い方法:http://stackoverflow.com/questions/6966558/batch-file-for-f-tokens –

8

Aaciniが私の最初の解決策に敗北しました。文字列にスペースや特殊文字を含めることができるように引用符を追加することで改善できますが、それでも正しい結果が得られます。

set "str=foo bar:biz bang:this & that" 
for %%S in ("%str::=" "%") do echo %%~S 

ソリューションには制限があります。

  • ありません*か?同様

第二の溶液の特殊文字がある場合は特に、文字列はすでに引用符( ")が含まれている場合

  • 問題が発生する可能性が文字列で表示されますと、奇妙な構文を持っていますが、コンセプトはかなり単純です。 "string"のFOR/Fは、改行文字に壊れます。各行は、独自の文字列として処理されます。:の区切り文字を改行文字に置き換える方法があります。また、次の行は遅延変数展開を終了する!で始まる必要があります。先頭に空白を入れないでください。

    もうひとつ気になるのは、厄介なFOR/F「EOL」オプションです。デフォルトでは;というEOL文字で始まる値はスキップしたくありません。文字列デリミタ:を削除したので、安全にEOLとして使用できます。

    最後に遅延拡張を使用する必要がありますが、ループ内の遅延拡張を最初に無効にしないと、%% S展開中に!が壊れます。

    set "str=foo bar:biz bang:this & that "^& the other thing!":;How does this work?" 
    setlocal enableDelayedExpansion 
    set ^"str=!str::=^ 
    
    !" 
    for /f "eol=: delims=" %%S in ("!str!") do (
        if "!!"=="" endlocal 
        echo %%S 
    ) 
    

    私はこの技術は、あなたがそれに投げるものは何でも処理できると信じています。

    jebはバッチ内で改行を処理する方法を最初に示していました。特に、このテクニックの使い方を教えてください。それはSOのどこか他の場所に既に投稿されているかもしれません。

  • +0

    あなたはなぜあなたが '^"のような最初の引用符をエスケープしているのか教えてもらえますか?なぜあなたは2番目のものを逃れることができないのですか? – aschipfl

    +0

    私はそれを知っています:エスケープされていない '' 'は' '^ 'を文字通り保持させるでしょう...不思議なことに私はコードをテストすることではなく、何かに参加することによって私はコメントを投稿して以来、まったく違う。かなり不気味です、それはありませんか? ;-) – aschipfl

    1

    これは、(ループの変数アクセス可能な外に文字列を解析します。

    setlocal enabledelayedexpansion 
    
    set your_string="whatever:you:want" 
    
    for /f "tokens=1,2,3 delims=:" %%a in ('echo !your_string!') do (
        set first_sub_string=%%a 
        set second_sub_string=%%b 
        set third_sub_string=%%c 
    ) 
    
    echo Congrats. !your_string! was parsed as !first_sub_string!, !second_sub_string!, !third_sub_string! 
    
    関連する問題