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


28

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

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

Answers:


29

此批处理脚本将执行此操作。

@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%"命令,获取目标下所有子目录中所有文件的列表。

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

空的扩展名将替换为“ FileWithNoExtension”,因此您知道存在这样的文件-如果我添加了空行,则它不是那么明显。

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

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

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


+1 @Bob:了不起的答案,加上解释也是极大的帮助。刚刚测试了脚本,查看了测试结果,一切都很好。再次感谢!
失误了2012年

1
它完全有效!我使用了以下语法:batchfile "path" >filename.txt
lucaferrario 2014年

很棒的脚本!但是有一个小错误:如果文件夹包含文件aaa.csszzz.cs.cs脚本将不会报告扩展名。
Goozak '16

1
@Goozak哎呀。立即修复。文本搜索的奇迹...必须确保搜索查询:以强制其匹配边界而结束。
鲍勃

19

尽管不严格满足批处理脚本的要求,但我使用了单行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.

那里的任何子目录也不会被解析,但其他所有结果仍将显示。


谢谢,同意这是一个有用的答案。在一个不相关的注释上,您有些困惑,您只发布了一个答案,却没有连续100天访问超级用户的“狂热”徽章。您是否对该网站加了书签?
失误2014年

徽章是在2010年荣获当我有效潜伏,但我远远的SO更加活跃:stackoverflow.com/users/31532/dan-atkinson。:)
Dan Atkinson

4

这是使用PowerShell的详细答案(在Windows XP中,您必须安装PowerShell):

嘿,脚本专家!如何使用Windows PowerShell挑选文件集合中使用的唯一文件扩展名?


1
尽管PowerShell绝对比命令行简单得多,但它基于.NET。不幸的是,这违背了“我宁愿不必安装dot-net”。
鲍勃

1
+1 @RichardM:同意鲍勃。另外,与发现扩展实例计数相关的代码-对PowerShell一无所知-占用大量内存;我的意思是,不仅要对每个实例进行计数,还可以创建一个数组来存储每个扩展的重复实例,然后在最后对每个扩展数组进行计数,这对我来说似乎很奇怪计算扩展实例。我想念什么吗?(也就是说,第一个PowerShell单行代码很好,如果我不喜欢dotnet,我会尝试一下。)
错误

1
这还算公平。这个问题可能会吸引那些更愿意使用PowerShell解决方案的搜索者。请注意,一个不错的Google搜索也会找到上述链接。
RichardM 2012年

3
为此链接+1。错误显然不喜欢所有.net,但这并不意味着上面的解决方案是对该问题的最佳长期解决方案。语言越多,我认为越好。
史蒂夫·拉斯伯恩

1
这是另一个使用powershell解决递归搜索的链接。robertbigec.wordpress.com/2011/01/07/…–
goodeye

0

要在您使用的路径下列出cmd的所有唯一扩展名:

Powershell -Command "Get-ChildItem . -Include *.* -Recurse | Select-Object Extension | Sort-Object -Property Extension -Unique"

0

我发现改变很有用

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

然后我就可以将其用于我的项目。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.