

コマンドプロンプトを使用して、ファイル名を取り出し、空白で区切った一覧として出力させたいです。  
バッチファイルでdirコマンドを使用した時に以下の結果になるようなときに

[code]

    >dir /B
    A.txt
    B.txt
    C.txt   
    
[/code]

以下のスクリプトでスペース区切りのファイル名が出現する想定でした。

[code]

    @echo off  
    for /F %%A in ('dir /B') do (  
        set STR=%STR% %%A  
    )  
    echo "%STR%"
    
[/code]

想定する実行結果：

[code]

    " A.txt B.txt C.txt"
    
[/code]

しかし、上記スクリプトでは何も表示されません。  
スクリプトファイルが間違ってると思われるのですが、どこを間違っているのかが、わからないためご教示いただければと思います。


CC BY-SA 3.0
2015-01-17T14:32:18.573
4745
2017-01-10T23:54:03.477
2015-01-17T15:10:43.803
30
2647
question
windows command-line batch-file
dirコマンドで取り出したファイル名を連結させたい


そのままの例がSETコマンドのヘルプ(`set /?`)に書いてありました。

まず、遅延環境変数の展開をONにしておく(`cmd /V:ON`)  
そうすると以下の様に書けます。

[code]

    @echo off
    set STR=
    for /F %%A in ('dir /B') do set STR=!STR! %%A
    echo "%STR%"
    
[/code]

また、FORの部分は単に`for %%A in (*) do set STR=!STR! %%A` で良いと思います。

でも、このために`cmd /V:ON`をするとコマンドシェルをネストしてしまいますし、  
JScript または、VBScriptを使用するのがいいのではないかと思います。


CC BY-SA 3.0
2015-01-17T15:03:32.350
4750
2015-01-17T15:03:32.350
5044
4745
answer


私の環境（Windows7）では、結果は`" c.txt"`になりました。

お望みの結果を得るには、遅延環境変数を使います。

[code]

    @echo off
    setlocal enabledelayedexpansion
    set STR=
    for /F %%A in ('dir /B') do (
      set STR=!STR! %%A
    )
    echo "%STR%"
    endlocal
    
[/code]

詳しいことは、以下のページが参考になると思います。

[バッチファイル。IF文やFOR文の中で複数コマンドを書く時の注意点 - Windowsのコマンドプロンプト(bat,cmd) - to_dk
notebook](http://tounderlinedk.blogspot.jp/2011/01/if-windowsbatcmd.html)


CC BY-SA 3.0
2015-01-17T15:04:54.367
4751
2015-01-17T15:04:54.367
6150
4745
answer


既に遅延評価の回答がありますが、サブルーチンを使う方法もあります。この場合は、`cmd.exe` に `/V`
オプションを付けなくても期待通りの結果を得ることができます。

[code]

    @echo off
    set STR=
    for /F %%A in ('dir /B') do (
      call :add %%A
    )
    echo "%STR%"
    
    :add
    set STR=%STR% %1
    
[/code]


CC BY-SA 3.0
2015-01-17T15:09:45.063
4753
2015-01-17T15:09:45.063
4745
answer