技術とか戦略とか

証券レガシーシステムを8年間いじった普通のSEによるブログ。技術のみではなく趣味の戦略考察についても。PCから見た方が色々見やすいと思います。

Windowsバッチでサブディレクトリ内のファイル名を再帰的に取得

dirコマンドでできそうでできなかったのでメモ。

 

【フォルダ構成】
C:\tmp>dir /s
 ドライブ C のボリューム ラベルは XXX です
 ボリューム シリアル番号は XXX です

 C:\tmp のディレクト

2018/07/31  22:35    <DIR>          .
2018/07/31  22:35    <DIR>          ..
2018/07/31  22:32    <DIR>          test
2018/07/31  22:34               185 test.bat
               1 個のファイル                 185 バイト

 C:\tmp\test のディレクト

2018/07/31  22:32    <DIR>          .
2018/07/31  22:32    <DIR>          ..
2018/07/31  22:27    <DIR>          1
2018/07/31  22:28    <DIR>          2
               0 個のファイル                   0 バイト

 C:\tmp\test\1 のディレクト

2018/07/31  22:27    <DIR>          .
2018/07/31  22:27    <DIR>          ..
2018/07/31  22:27                 0 hoge.txt
               1 個のファイル                   0 バイト

 C:\tmp\test\2 のディレクト

2018/07/31  22:28    <DIR>          .
2018/07/31  22:28    <DIR>          ..
2018/07/31  22:27                 0 fuga.txt
               1 個のファイル                   0 バイト

     ファイルの総数:
               3 個のファイル                 185 バイト
              11 個のディレクトリ  35,063,934,976 バイトの空き領域

C:\tmp>

 

【test.batの中身】
rem remはコメント

rem C:\tmpへ移動
cd C:\tmp

rem output.txtを空ファイルで出力
type nul > output.txt

rem ファイル一覧(フルパス)をtmp.txtに出力
rem testフォルダ以下の全ファイルが対象
dir /a-d /b /s test > tmp.txt

rem tmp.txtからファイル名と拡張子のみ抽出
rem tmp.txtを1行ずつ加工しoutput.txtに出力
rem 全行処理後にtmp.txtは削除
for /f %%a in (tmp.txt) do (call :method %%a)
del tmp.txt
:method
if %1 NEQ "" (echo %~n1%~x1>>output.txt)
goto :eof

 

【test.bat実行後のoutput.txtの中身】
hoge.txt
fuga.txt

--------------------------

手作業だと終わらないけどプログラムを作るほどでもない作業が発生することは度々あるので、そのような時にWindowsバッチをパパっと作れるようになると作業効率化になったりします。
他のスクリプト言語でも良いですが、WindowsバッチだとWindows端末ならどこでも使えるので。
他にもExcelやsakuraエディタの機能を使いこなせるようになると作業が早くなるので、このあたりのことは随時記事にしていきたいと思います。