利用中の拡張子を抽出するバッチ (存在するファイルの拡張子の種類を,バッチで全取得する)
あるフォルダ内に存在する全ファイルの,拡張子の種類を知りたい。
- 「.PNGはあるか?」とか,
- 「.htmlだけでなく,.htmも使ってたっけ?」とか,
一覧表形式にして,一発で把握したい。
そのためのバッチ。
利用されている全拡張子を抽出.bat
@echo off echo ■カレント以下の全ファイルから,拡張子の種類を抽出し,結果をファイルに保存します。 rem ---------- 設定項目 ------------- rem 出力ファイル set RESULT_FILE_NAME=exts_result.txt rem 中間ファイル1 set TMP_FILE_NAME=_tmp1_%RESULT_FILE_NAME% rem 中間ファイル2 set TMP_FILE_NAME2=_tmp2_%RESULT_FILE_NAME% rem 中間ファイル3 set TMP_FILE_NAME3=_tmp3_%RESULT_FILE_NAME% rem ---------- 全ファイルの拡張子を抽出 ------------- echo ■全ファイルの拡張子を%TMP_FILE_NAME%内に記録中・・・ rem 中間ファイルがあれば削除 if exist %TMP_FILE_NAME% ( del %TMP_FILE_NAME% ) rem カレント以下のファイルを再帰的に処理。フォルダは除外 for /F "usebackq" %%i in (`dir /A-D /s /b *.*`) do ( rem 拡張子を持つファイルであれば if not "%%~xi"=="" ( rem 拡張子を書き出し echo %%~xi>> %TMP_FILE_NAME% ) ) rem ---------- 抽出内容をソート ------------- echo ■ソート結果を%TMP_FILE_NAME2%内に記録中・・・ rem 全読み込み後,ソート ※同一ファイル内にリダイレクトは不可能 type %TMP_FILE_NAME% | sort > %TMP_FILE_NAME2% rem ---------- 抽出内容をuniq ------------- echo ■重複を除去した結果を%TMP_FILE_NAME3%内に記録中・・・ rem 中間ファイルがあれば削除 if exist %TMP_FILE_NAME3% ( del %TMP_FILE_NAME3% ) rem ソート済み内容の全行を順番に読み込み for /f "tokens=* delims=" %%L in ( %TMP_FILE_NAME2% ) do ( rem この行をサブルーチンに渡す call :WRITE_UNIQUE_LINE %%L ) goto END_WRITE_UNIQUE_LINE rem ---------- uniq用のルーチン ------------- :WRITE_UNIQUE_LINE rem 今回のルーチン引数が,前回と同じか判定 if not "%_PREVIOUS_ARGS%"=="%*" ( rem 前回と異なっていた場合 rem ファイルに記録 echo %*>> %TMP_FILE_NAME3% rem 次回の比較のために保持 set _PREVIOUS_ARGS=%* ) rem ルーチンの終わり goto :EOF :END_WRITE_UNIQUE_LINE rem ---------- 完了 ------------- echo ■最終結果を%RESULT_FILE_NAME%に記録中・・・ rem 最終結果を保持 type %TMP_FILE_NAME3% > %RESULT_FILE_NAME% rem 中間ファイルを削除 del %TMP_FILE_NAME% del %TMP_FILE_NAME2% del %TMP_FILE_NAME3% echo ■終了しました。 pause
実行例:
X:\>exts.bat ■カレントフォルダ以下の全ファイルから,拡張子の種類を抽出し,結果をファイルに保 存します。 ■全ファイルの拡張子を_tmp1_exts_result.txt内に記録中・・・ ■ソート結果を_tmp2_exts_result.txt内に記録中・・・ ■重複を除去した結果を_tmp3_exts_result.txt内に記録中・・・ ■最終結果をexts_result.txtに記録中・・・ ■終了しました。 続行するには何かキーを押してください . . .
結果のサンプル:
.ActiveTcl .aliases .atheos .awk .bak .bash_history .bash_logout .bash_profile .bashrc .bat .bau .bcc32 .bmp 〜中略〜 .Xresources .xscreensaver .xsd .xsession .xsession-errors .xslt .y .yaml .zip
参考:
NT系:パラメータ参照方法の拡張
http://fpcu.on.coocan.jp/dosvcmd/batc...
- %1という環境変数から拡張子だけ抜き出すには,%~x1とする。
unixのuniqに相当するコマンドは?
http://fpcu.on.coocan.jp/dosvcmd/bbs/...
- linuxのuniqコマンドはWindowsには無いので自作
goto
http://www.ne.jp/asahi/hishidama/home...
- :EOFというラベルは、暗黙に定義されている。ここへのgotoは「バッチファイルの終了へ飛ぶ」、すなわち「バッチを終了する」ということ。(通常のgotoではラベル名に「:」コロンは不要だが、:EOFへのgotoには必要)
バッチファイル中のサブルーチンからの戻り方
http://fpcu.on.coocan.jp/dosvcmd/bbs/...
- 同一ファイル内にあるサブルーチンをCALLした場合,メインルーチンへ戻る方法は goto :EOF
既知の不具合
コマンドプロンプトのsortコマンドは,常にアルファベットの大文字・小文字を区別しない。
List of DOS commands : sort
http://en.wikipedia.org/wiki/List_of_...
- This sort is always case insensitive.
Microsoft Technet: MSDOS / Sort
http://technet.microsoft.com/en-us/li...
- Uppercase vs. lowercase
- Sort does not distinguish between uppercase and lowercase letters.
例:
W:\>dir /B | sort a1.c A2.c a3.c A4.c
本当は下記のようになって欲しいのだが・・・。
a1.c a3.c A2.c A4.c
なので,バッチの実行結果にも同一の拡張子が紛れ込む場合がある。
.LOG .log .LOG .log
これを統一することもやればできるのだが,非常に重いので対応しない。
バッチファイル 英字の小文字→大文字変換
http://toriaezuyattemiru.cocolog-nift...