选择#1:FOR / R对我而言比#2更直观。
替代方法2:FOR / F解决了BrianAdkins建议中“名称中的空格”的问题。
替代方案3:我建议选择FORFILES,只是路径用双引号引起来。
布赖恩(Brian)或其他专家可能有一个更优雅的解决方案,或者可能会提出其他十二种解决方案,但是这三项可行。我尝试使用FOR TOKENS,但随后不得不剥离页眉和页脚,因此我又回到了#1。我还考虑过创建一个小的.bat文件并调用它,但这会添加另一个文件(尽管它确实提供了更大的灵活性,就像函数一样)。
我测试了所有替代方法,包括目录和带有嵌入式空格的文件名,200多个字符的文件名,不带扩展名的文件名以及在小驱动器的根目录上(只是时间;有点慢-正如Brian所建议的-但后来如此)在Windows资源管理器中搜索;这就是为什么我安装了“所有搜索”应用程序的原因。
选择#1:FOR / R
最佳(?)在试图弄清为什么Brian的解决方案对我不起作用时,我看了一下HELP FOR并决定尝试使用/ R方法。(创建文件与替代方法2中的相同。)
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
示例-作品(与上述目录不同,以演示递归)
@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
备选方案2:FOR / F
BrianAdkins的建议: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
一个修正的回答是:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
抑制目录并输出(附加)到文件的更完整答案是:
@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt
注意:“ delims = *”指定文件名中不允许的字符。
注意:第二个命令还通过/ a:-d禁止显示目录。
注意:如果有人选择了不同的变量名,则将FOR变量名大写以阐明变量和变量参数之间的区别。
注意:由于OP要求输出到文件,因此仅针对咧嘴声进行归档。
我想我应该检查一下ECHO的状态并将其重置。
问题-名称中的空格
Brian提出的解决方案不处理包含空格的文件和文件夹名称(至少在我的Vista配置中不这样)。
示例-错误
(没有delims;包括每个OP的禁止目录,但文件名前后都有大小以进行强调)
截断的名称和大小(6个文件中有4个不正确):
@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder
C:\DeleteLater\Folder
C:\DeleteLater\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
示例-正确
(注释输出到屏幕,未附加到文件)
@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
备选方案3:FORFILES (报价)
此解决方案直接来自FORFILES文档(forfiles /?
)中的最后两个示例。
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
将这些示例结合起来并写入文件即可得出答案(几乎):
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
请注意,路径在输出中用引号引起来。
不要紧,无论echo on
或echo off
翻转。
添加空白行分隔每个目录将是IF的重要扩展。
注意:使用掩码/m *.*
不会返回没有扩展名的文件(例如示例中的最后一个文件)!
除了:这写在每个目录只有该目录内容的文件:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
不是什么OP想,但有时很方便。
示例-作品(但用全路径加引号)
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize"
"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0
本示例包括一个额外的目录,该目录具有超长文件名和不带扩展名的文件名。
问题:引号路径
因此,是否有一种简单的方法可以删除每个OP示例中不需要的(?)引号并保存替代方法3:FORFILES。(反问:引号是功能还是缺陷?)
"tokens=*"
以下内容@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za