替代方案#1:FOR /R对我来说比#2更直观。
备选方案#2:FOR /F解决了BrianAdkins建议中 “名字中的空格 "的问题。
备选方案#3:FORFILES是我的选择,除了路径是双引号。
Brian或其他大师可能会有更优雅的解决方案,或者能提出一打其他的解决方案,但这三个方案是可行的。我试过使用FOR TOKENS,但后来不得不剥离页眉和页脚,所以我又回到了#1。我也考虑过创建一个小的.bat文件并调用它,但那会增加另一个文件(尽管它确实提供了更大的灵活性,就像一个函数一样)。
我测试了所有的备选方案,包括带空格的目录和文件名、200多个字符的文件名、没有扩展名的文件名,以及在一个小硬盘的根部(只是为了节省时间;有点慢–就像Brian建议的那样–但在Windows资源管理器中搜索也是如此;这就是为什么我安装了Everything搜索程序)。
备选方案#1: FOR /R
最佳(?)在试图弄清楚为什么Brian的解决方案对我不起作用的时候,我看了HELP FOR,决定尝试/R的方法。(创建文件的方法和第2种方法一样。
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Example - Works (与上面不同的目录来演示递归)
@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 Spacesnd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
备选方案#2: FOR /F
BrianAdkins的建议。
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
注:"delims=/*"指定了文件名中不允许使用的字符。
注:第二条命令也通过/a:-d抑制目录。
注:将FOR变量名改为大写,以便在有人选择不同的变量名时明确变量和变量参数的区别。
注:附加到文件只是为了搞笑,因为上位机要求输出到文件。
我想我真的应该检查一下ECHO的状态,然后把它复位。
问题 - 名称中的空格
Brian提出的解决方案不能处理包含空格的文件和文件夹名称(至少在我的Vista配置上不能)。
Iample - Wrong(无 delims; 包括按 OP 压制目录,但文件名前后都有大小以强调)
Truncated Name and Size (6 个文件中有 4 个不正确)。
@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
示例 - 正确(注意输出到屏幕上,而不是附加到文件中)
@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\FolderNoSpacesrd
28726032 C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
备选方案#3:FORFILES (报价问题)
这个解决方案直接来自FORFILES文档中的最后两个示例(@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
)。
@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 Spacesnd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
结合这些例子并写入一个文件,得到的答案(几乎)是:
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
请注意输出中的路径是引号。
不管是forfiles /?
还是echo on
被切换,都不重要。
在每个目录之间添加一个空行,是IF的琐碎扩展。
Caution 。使用掩码echo off
将不会返回没有扩展名的文件(比如例子中的最后一个文件)!
Aside 。这将在每个目录下写一个文件,内容只包含该目录。
/m *.*
不是上位机想要的,但有时很方便。
Example - Works (but with fullpath in quotes)
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
这个例子包括一个超长文件名的额外目录和一个没有扩展名的文件名。
问题。路径中的引号
那么,是否有一个简单的方法来去除OP例子中不需要的(?)引号,并保存备选方案#3:FORFILES。(反问:引号是一个特点还是一个缺陷?)