在一个目录内,并在其子目录内递归,意味着处理目录内的每个目录,如何编译目录内唯一扩展的完整列表?
操作系统是带有所有当前更新的 Windows XP,但是如果我能够知道它在做什么,我就可以运行脚本,尽管我宁愿不安装 dot-net,因为我真的不喜欢它。
答案1
这个批处理脚本将会完成这个任务。
@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,则表示当前扩展目前不在列表中,应添加。
echo 行基本上输出,并且我还:
用换行符替换了占位符()以使其看起来美观。
答案2
虽然不严格满足批处理脚本的要求,但我使用了单行管道PowerShell
脚本:
Get-Childitem C:\MyDirectory -Recurse -File | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt
在哪里:
Get-ChildItem C:\MyDirectory -Recurse
检索目录和子目录中的所有文件。Group Extension -NoElement
按文件扩展名对结果进行分组。Sort Count -Desc
按每组中匹配的扩展数对结果进行排序(从多到少)。> FileExtensions.txt
将结果通过管道传输到指定的文件。
您可以从命令行/批处理文件运行它:
Powershell -Command "& Get-Childitem C:\MyDirectory -Recurse -File | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt"
如果删除,C:\MyDirectory
它将在当前目录中执行。
编辑2021-04-20:根据@ManSamVampire 的评论,如果您也想查找隐藏文件,则应在上面的命令-Force
之前添加。-Recurse
最后它将生成一个包含以下内容的 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,你可以从这里.它还可在多种操作系统上运行。
答案3
要列出您正在使用的路径下 cmd 的所有唯一扩展:
Powershell -Command "Get-ChildItem . -Include *.* -Recurse | Select-Object Extension | Sort-Object -Property Extension -Unique"
答案4
我发现改变它很有用
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
然后我就可以将其用于我的项目了。