2010-11-23 10 views
2

ファイルのリストを文字列( "file1.txt file2.txt filr3.txt ...")としてコンパイルするバッチスクリプトを作成しています。私は処理するファイルのリストを渡す必要があるアプリケーションを実行したいので、これをやっています。バッチ一覧質問

すべてのファイルは同じフォルダにあります。私は、次のコードを実行すると

は:

FOR /f "tokens=*" %%M IN ('dir * /b') DO (
    SET files=%files% %%M 
) 
ECHO END %files% 

終わりにエコーが唯一の処理された最後のファイル全体ではなく、リストを提供します。私の実装に何が問題なのですか?あなたはあなたが遅れた拡張を使用する必要が

答えて

4

を与えることができます任意の助け

ありがとう:

setlocal enabledelayedexpansion 
for /f "tokens=*" %%M in ('dir * /b') do (
    set files=!files! %%M 
) 
echo END %files% 

あなたはhelp setにそのドキュメントを見ることができます:

遅延環境変数の展開があります近づくのに便利 行の のテキストが読み込まれたときに起こる現在の拡張の制限実行される。次の例 は即時変数展開に問題があることを示しています。最初のIF文が読まれたとき、それは論理的に 体を含んでいるため%VAR%の両方でIF文は が、置換されているので

set VAR=before 
if "%VAR%" == "before" (
    set VAR=after 
    if "%VAR%" == "after" @echo If you see this, it worked 
) 

は、メッセージを表示することはありませんIFの複合ステートメントです。コンパイルステートメント内の IFは、実際には「前」と「後で」のどちらでも同じではない とを比較しています。予想通り同様に、次の例 では動作しません。

set LIST= 
for %i in (*) do set LIST=%LIST% %i 
echo %LIST% 

をそれはは、カレントディレクトリ内のファイルのリストを構築 ではなく、単に最後のファイルにLIST変数を設定しますしないことに見つかりました。 FORステートメントが読み取られ、その時点でLIST変数が空のときに%LIST%が1回だけ展開されるためです。 だから我々が実行されている実際のFORループがある:ちょうど最後に見つかったファイルにLISTを設定し続ける

for %i in (*) do set LIST= %i 

。これは微妙な方法で破ることができるよう

さらに、あなたは今まで以上dir出力を反復するfor /fを使用しないでください。スペースを含むファイル名には特別な扱いが必要で、ラスターフォントとUnicodeで破損します。

for %%M in (*) do ... 
+0

ありがとう:基本的には、「現在のOEMコードページに変換し、その出力をトークン化し、代わりにファイルだけを反復処理するforを求めてのもので動作するようにしようと、ねえ、私はコマンドを実行しているよ」言っています。これによりすべてが修正されます。 – VerticalEvent