2011-12-07 19 views
1

実行可能ファイルに引数として渡す変数として、ディレクトリ内のすべての.dllと.exeの(セミコロンで区切られた)リストを取得したいと考えています。私はいくつかのことを試しましたが、期待どおりに動作することはありません。DOSバッチファイルを使用して実行可能ファイルに渡すファイルのリストを作成するにはどうすればよいですか?

CLS 
@ECHO OFF 
SET INPUT_FILES= 
for /f %%x in ('dir /b E:\Builds\MyProgram\Release\*.exe E:\Builds\MyProgram\Release\*.dll') do ECHO %%x 

...しかし、次のステップは非常に適切ではないと私は何を仕事に苦労している:私は後だファイルのリストを以下のプリントアウト - 私はそこの部分の道を持っています私は間違って持っている:

CLS 
@ECHO OFF 
SET INPUT_FILES= 
for /f %%x in ('dir /b E:\Builds\MyProgram\Release\*.exe E:\Builds\MyProgram\Release\*.dll') do IF DEFINED INPUT_FILES SET INPUT_FILES=INPUT_FILES;%%X ELSE SET INPUT_FILES=%%X 
ECHO %INPUT_FILES% 

私はここに問題を解決する方法を考え出すことができれば、別の実行ファイルへの入力として%INPUT_FILES%を渡すつもりです。

編集

私は、次のコマンドを実行すると、私はINPUT_FILES変数を更新することができます

IF "%INPUT_FILES%"=="" (SET INPUT_FILES=Test1) ELSE (SET INPUT_FILES=Test1a) 
IF "%INPUT_FILES%"=="" (SET INPUT_FILES=Test2) ELSE (SET INPUT_FILES=%INPUT_FILES%;Test2a) 
ECHO %INPUT_FILES% 

..which出力:

Test1;Test2a 

..but私がしようとした場合それをFORループに追加すると、何も得られません。

CLS 
REM @ECHO OFF 
SET INPUT_FILES= 
for /f %%X in ('dir /b E:\Builds\MyProgram\Release\*.exe E:\Builds\MyProgram\Release\*.dll') do (IF "%INPUT_FILES%"=="" (SET INPUT_FILES=%%X) ELSE (SET INPUT_FILES=%INPUT_FILES%;%%X)) 
ECHO %INPUT_FILES% 

答えて

3

問題はパーセント変数の拡張です。
これらは解析時に展開されます(ブロックの場合も同様)。

遅延拡張を使用すると、構文はほぼ同じですが、%variable%の代わりに!variable!となります。
違いは次のとおりです。展開は実行時ではなく、解析時に行われます。

@ECHO OFF 
CLS 
setlocal EnableDelayedExpansion 
SET "INPUT_FILES=" 
for /f %%X in ('dir /b E:\Builds\*.exe E:\Builds\*.dll') do (
    IF "!INPUT_FILES!"=="" (
    SET "INPUT_FILES=%%X" 
) ELSE (
    SET "INPUT_FILES=!INPUT_FILES!;%%X" 
) 
) 
ECHO !INPUT_FILES! 
+0

恐ろしい - 私は前の例では感嘆符を見たのだが、それらが適切に評価されていないので、 'SETLOCAL EnableDelayedExpansion'ラインを持っていませんでした。 –

+0

'/ f %% X in( 'dir ...')のdoに対してdoを実行すると、最後のセミコロンを削除するだけで、それぞれの名前の後ろにセミコロンを追加すると' IF'コマンドを避けることができます。INPUT_FILES =!INPUT_FILES !%% X; "'と '' SET INPUT_FILES =!INPUT_FILES:〜0、-1! ' – Aacini