回答:
このバッチスクリプトはそれを行います。
@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
、本質的にブラックホールになります。:
リストの最後に常にa を追加する:
ため、部分的な結果と一致しないように、検索クエリが必ずaで終わるようにする必要があります-コメントを参照してください。
%ERRORLEVEL%はfind
コマンドによって設定され、値0は一致があったことを示します。したがって、0でない場合、現在の拡張子はリストにないため、追加する必要があります。
エコー行は基本的に出力され、プレースホルダー(:
)を改行に置き換えて見た目を良くしています。
batchfile "path" >filename.txt
aaa.css
とが含まれている場合zzz.cs
、拡張子.cs
はスクリプトによって報告されません。
:
境界に一致するように強制するために、検索クエリが終了することを確認する必要がありました。
厳密にはバッチスクリプトの要件を満たしていませんが、単一行の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.
そこにあるサブディレクトリも解析されませんが、他のすべての結果は表示されます。
PowerShellを使用した詳細な回答を次に示します(Windows XPではPowerShellをインストールする必要があります)。
こんにちは、Scripting Guy!Windows PowerShellを使用して、ファイルのコレクションで使用されている一意のファイル拡張子を取得する方法はありますか
変更すると便利だと思いました
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
これをプロジェクトに使用することができました。