如何在目录中提取完整的扩展类型列表?

blu*_*ers 36 script shell-script file-extension windows-xp batch-file

在目录中,并在其子目录中递归,这意味着处理目录中的每个目录,我如何编译目录中唯一扩展的完整列表?

操作系统是带有所有当前更新的 Windows XP,但是如果我能够知道它在做什么,我可以运行脚本,尽管我不想安装 dot-net,因为我真的不喜欢它。

Bob*_*Bob 35

这个批处理脚本会做到这一点。

@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
Run Code Online (Sandbox Code Playgroud)

将其另存为任何.bat文件,并使用命令batchfile(替换您命名的任何内容)运行它以列出当前目录,或使用batchfile "path". 它将搜索所有子目录。

如果要导出到文件,请使用batchfile >filename.txt(或batchfile "path" >filename.txt)。

解释

for /f...行之前的所有内容都只是设置:它获取要搜索的目标目录,启用延迟扩展,这让我可以在循环中更新变量并定义一个换行符 ( LF),我可以将其用于更整洁的输出。哦,还有%~1“获取第一个参数,删除引号”的意思,它可以防止双引号 - 请参阅for /?.

该循环使用该dir /b /s /a:-d "%target%"命令,获取目标下所有子目录中所有文件的列表。

%%~xidir命令返回的完整路径中提取扩展名。

一个空的扩展名被替换为“FileWithNoExtension”,所以你知道有这样一个文件——如果我添加了一个空行,它就不那么明显了。

整个当前列表如果通过find命令发送,以确保唯一性。find 命令的文本输出被发送到nul,本质上是一个黑洞 - 我们不想要它。由于我们总是:在列表的末尾附加 a ,我们还应该确保搜索查询以 a 结尾,:以便它不匹配部分结果 - 请参阅注释。

%ERRORLEVEL% 由find命令设置,值为 0 表示存在匹配。因此,如果它不是 0,则当前扩展名目前不在列表中,应该添加。

echo 行基本上是输出,我还:用换行符替换了我的占位符 ( ) 以使其看起来不错。


Dan*_*son 34

虽然不严格满足批处理脚本的要求,但我使用了单行PowerShell脚本:

Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt
Run Code Online (Sandbox Code Playgroud)

您可以从命令行/批处理文件运行它:

Powershell -Command "& Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt"
Run Code Online (Sandbox Code Playgroud)

如果删除C:\MyDirectory它将在当前目录中执行。

编辑 2021-04-20:根据@ManSamVampire的评论,如果您还想查找隐藏文件,则应在上述命令中添加-Force之前-Recurse

最后,它会生成一个 FileExtensions.txt,其中包含如下内容:

+-------+------+
| Count | Name |
+-------+------+
| ----- | ---- |
| 8216  | .xml |
| 4854  | .png |
| 4378  | .dll |
| 3565  | .htm |
| ...   | ...  |
+-------+------+
Run Code Online (Sandbox Code Playgroud)

根据您的文件夹结构,您可能偶尔会收到错误消息,通知您路径很长。

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.
Run Code Online (Sandbox Code Playgroud)

也不会解析其中的任何子目录,但仍会显示其他所有内容的结果。

笔记

您当然需要 PowerShell,您可以从这里获取。它还可以在多个操作系统上运行。