晴耕雨読

working in the fields on fine days and reading books on rainy days

[Windows] 任意の階層にある全てのReleaseフォルダからexeを集めるコマンド

Visual Studio でコンパイルすると、デバッグ時は obj/Debug、リリース時は obj/Release フォルダの中に成果物の exe や dll が作成されます。 最終的に出荷媒体を作るときは、Releaseフォルダ内の exe を集めることになりますが、バッチコマンドで集める方法について説明します。

結論としては、現在のフォルダ以下の全ての Release フォルダから exe を集めるには、次のバッチファイルを実行します。

for /r /d %%a in (*Release) do xcopy /y %%a\*.exe .\bin

for の /r オプションは現在のフォルダ以下の全てのフォルダを探索します。 また、/d オプションは、セット(inの右項)にワイルドカードを含むときはディレクトリを探索するようになります。 for の変数 %%a には Release フォルダまでのパスが格納されるので、%%a\*.exe を展開すると Release 内の exe ファイルを見つけることができます。 最後に xcopy で exe を出荷媒体の保存先(上の例ではbin)にコピーします。 これで、Batchファイルで任意の階層にある全てのReleaseフォルダからexeを集めることができるようになります。

指定のフォルダ下の exe を収集したい場合は、/r パス を指定します。

for /r C:\path\to\folder /d %%a in (*Release) do xcopy /y %%a\*.exe .\bin

注意点

上記のコマンドを Windows のコンソールで直接実行する場合は、%%a%a に置き換えてから実行してください。

補足

以下 for コマンドのオプション /d と /r の説明です。

FOR /D %変数 IN (セット) DO コマンド [コマンド パラメーター]

    セットがワイルドカードを含む場合は、ファイル名ではなくディレクトリ名
    の一致を指定します。

FOR /R [[ドライブ:]パス] %変数 IN (セット) DO コマンド [コマンド パラメーター]

    [ドライブ:]パスから始めて、ツリーの各ディレクトリで FOR 文を実行し
    ます。/R の後にディレクトリが指定されていない場合は、現在の
    ディレクトリが使用されます。セットが単一のピリオド (.) である場合は、
    ディレクトリ ツリーの列挙だけを行います。

以上です。

参考文献

windows - 「指定ディレクトリ」内の「任意の階層」にある「指定ディレクトリ名」内にある全ファイルを抽出したい - スタック・オーバーフロー