在Windows批处理文件中,/D的默认顺序是什么?

3

我的公司有一个旧的批处理文件,其中有这样一行代码:

for /D %%i in (*) do call ..\ArchiveFeedFolder.bat %%i

从我们的日志看,似乎Windows默认按字母顺序排序目录。

例如,我在目录中有以下文件夹:

20150101

20150102

20150103

上述批处理命令将始终处理20150101,然后是20150102,最后是20150103。这种方式是否保证可行?我尝试查找一些文档,但似乎没有文档提到排序顺序。

for /D 

从经验来看(尽管没有明确测试过),我同意它似乎可以做到这一点,但我记不清是否有相关文档记录(但我没有去查找过)。如果你需要比“似乎可行”更强的保证,你可以尝试使用for /f "tokens=*" %%i in ('dir /b/ad/on *') do ... - TripeHound
1个回答

5

尽管如你所说,for /d 命令中的排序顺序是未记录的,并且正如 Mofi 在评论中指出的那样,它并不总是按名称排序,但在 NTFS 文件系统(Windows 大多数情况下使用)中,它会按名称排序。然而,如果您想确保它始终按名称排序,您应该使用这个新版本代替旧版本:

for /f "tokens=*" %%i in ('dir /b /a:d /o:n "*"') do call ..\ArchiveFeedFolder.bat %%i

/o:n强制按名称排序。有关更多信息,请参见for /ddir

我还想指出,如果您的文件夹名称包含空格,则使用未引用的参数调用ArchiveFeedFolder.bat会导致其崩溃。我建议使用do call ..\ArchiveFeedFolder.bat "%%i",并在ArchiveFeedFolder.bat中使用%~1%而不是%1。例如,当您复制文件夹时,请确保再次引用它,所以请使用copy "%~1" "someOtherFolder"而不是copy %1 someOtherFolder


1
这取决于文件系统。NTFS始终按字母顺序返回与模式匹配的目录/文件列表。但是,FAT16、FAT32和exFAT(以及其他一些文件系统)返回按分配表中存储的顺序匹配模式的文件/目录列表,这意味着不按名称排序。使用带有/o:n的__DIR__命令绝对是一个很好的解决方案,可以保证按名称排序获取目录/文件名。顺便说一下:/a:d/o:n中的冒号是可选的。 - Mofi
@Mofi 谢谢,我不确定顺序。选择性的冒号我知道,只是我认为这样更清晰明了。 - Dennis van Gils
没错,DIR /B /O:N 是一个好方法,只要文件名中没有超出当前代码页的 Unicode 字符。 - dbenham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接