ディレクトリ内、およびそのサブディレクトリ内で再帰的に、つまりディレクトリ内のすべてのディレクトリが処理されることを意味します。ディレクトリ内の一意の拡張機能の完全なリストをコンパイルするにはどうすればよいですか?
OSはWindowsですXP現在のすべての更新が含まれていますが、それが何をしているかを伝えることができればスクリプトを実行しても大丈夫ですが、ドットネットをインストールする必要はないので、本当にそれが好きではありません。
このバッチスクリプトはそれを行います。
@echo off
set target=%~1
if "%target%"=="" set target=%cd%
setlocal EnableDelayedExpansion
set LF=^
rem Previous two lines deliberately left blank for LF to work.
for /f "tokens=*" %%i in ('dir /b /s /a:-d "%target%"') do (
set ext=%%~xi
if "!ext!"=="" set ext=FileWithNoExtension
echo !extlist! | find "!ext!:" > nul
if not !ERRORLEVEL! == 0 set extlist=!extlist!!ext!:
)
echo %extlist::=!LF!%
endlocal
これを任意の.bat
ファイルとして保存し、コマンドbatchfile
(名前を付けたものに置き換えます)を使用して実行して現在のディレクトリを一覧表示するか、batchfile "path"
でパスを指定します。すべてのサブディレクトリを検索します。
ファイルにエクスポートする場合は、batchfile >filename.txt
(またはbatchfile "path" >filename.txt
)を使用します。
for /f...
行の前のすべてが設定するだけです。検索するターゲットディレクトリを取得し、 遅延展開 を有効にします。これにより、ループ内の変数を更新できます 改行を定義します( LF
) より正確な出力に使用できます。ああ、そして%~1
は「最初の引数を取得し、引用符を削除する」ことを意味し、二重引用符の重複を防ぎます-for /?
を参照してください。
ループはそのdir /b /s /a:-d "%target%"
コマンドを使用して、ターゲットの下のすべてのサブディレクトリにあるすべてのファイルのリストを取得します。
%%~xi
は、dir
コマンドが返すフルパスから拡張子を抽出します。
空の拡張子は "FileWithNoExtension"に置き換えられるので、そのようなファイルがあることがわかります-代わりに空の行を追加した場合、それほど明白ではありません。
一意性を確保するために、find
コマンドを介して送信された場合、現在のリスト全体。 findコマンドのテキスト出力はnul
に送信されます。これは基本的にブラックホールです-必要ありません。リストの最後に常に:
を追加するため、検索クエリが:
で終了するようにして、部分的な結果と一致しないようにする必要があります。コメントを参照してください。
%ERRORLEVEL%はfind
コマンドによって設定され、値0は一致があったことを示します。したがって、それが0でない場合、現在の拡張子はこれまでのところリストにないため、追加する必要があります。
エコー行は基本的に出力し、プレースホルダー(:
)を改行で置き換えて見栄えを良くしています。
バッチスクリプトの要件を厳密には満たしていませんが、1行のPowerShellスクリプトを使用しました。
Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt
コマンドライン/バッチファイルから実行する可能性があります。
Powershell -Command "& Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt"
私はそれについてクレジットを主張しません、そしてもちろん、あなたはPowershellをインストールする必要があります。新しいバージョンのWindowsでは、これを回避する方法はありません。
削除した場合C:\MyDirectory
現在のディレクトリで実行されます。
最後に、次のような内容を含むFileExtensions.txtを生成します。
+-------+------+
| Count | Name |
+-------+------+
| ----- | ---- |
| 8216 | .xml |
| 4854 | .png |
| 4378 | .dll |
| 3565 | .htm |
| ... | ... |
+-------+------+
フォルダ構造によっては、パスが長いことを通知するエラーが発生することがあります。
Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
そこにあるサブディレクトリも解析されませんが、他のすべての結果は表示されます。
変更すると便利だと思いました
if "!ext!"=="" set ext=FileWithNoExtension
に
if "!ext!"=="" set ext=.FileWithNoExtension
そして変更する
echo %extlist::=!LF!%
に
echo %extlist::=!LF!% > ext-list.txt
生成されたファイルには.bat.pdf.skp.ai.png.jpg.tif.pcp.txt.lst.ttf.dfont.psd.indd.docx.PDF.JPG.gif.jpegが含まれていました(ただし、改行は含まれていません)。 .dwg.exr.FileWithNoExtension.vrlmap.sat.bak.ctb
これを自分のプロジェクトで使用することができました。
使用中のパスの下にあるcmdのすべての固有の拡張機能をリストするには:
Powershell -Command "Get-ChildItem . -Include *.* -Recurse | Select-Object Extension | Sort-Object -Property Extension -Unique"