読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

利用中の拡張子を抽出するバッチ (存在するファイルの拡張子の種類を,バッチで全取得する)

windows コマンドプロンプト


あるフォルダ内に存在する全ファイルの,拡張子の種類を知りたい。

  • 「.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...