我们可以在Windows资源管理器中按名称排序的目录文件中看到。
如果我在Windows命令提示符下尝试相同的操作,则按名称命名不同 - 正确:
dir *.jpg /ON /B
cubierta.jpg
pag00.jpg
pag06.jpg
pag08.jpg
pag09.jpg
pag100.jpg
pag101.jpg
pag102.jpg
pag103.jpg
pag104.jpg
pag105.jpg
pag106.jpg
pag107.jpg
pag108.jpg
pag109.jpg
pag11.jpg, etc, etc, etc, ...
有没有办法让dir
按名称排序,在哪里读取数字就像人类一样?
答案 0 :(得分:7)
您最好的选择(如果可能)是在您的较小数字中添加足够的前导零(在本例中为两个),以便按预期排序。
答案 1 :(得分:4)
Windows资源管理器使用特殊的排序功能StrCmpLogicalW, cmd.exe 不使用它,因此输出的差异。不过,你可以用它编写自己的排序程序。
您可能也对迈克尔·卡普兰在this subject(来自Raymond Chen的suggestion box)的参赛作品感兴趣。
答案 2 :(得分:1)
他是他。你们都想知道我的解决方案吗?
我正在使用一个名为ImageMagic的程序将我的200MB PDF文件转换为JPG。在冗长的过程结束时,它按数字顺序序列化所有文件...因此,基本上文件创建日期在每个文件被写入硬盘驱动器时略有增加。因此,以下两个批处理文件命令之一将以“正确”顺序写入文件:
dir *.jpg /ODN /B > files.txt
for /f "tokens=*" %%a in ('dir *.jpg /ODN /B') do (
echo ^<page^>%%a^</page^> >>pages.xml.fragment
)
因此 dir * .jpg / OD 命令通过升序(创建?)日期对目录内容进行排序,我们可以完全忽略实际的文件名。
答案 3 :(得分:0)
当前没有内置的命令行工具可以自然排序。如果需要,请vote for the feature让Microsoft改变主意
这可以用正则表达式替换来模拟。在Windows上,您可以使用Jscript和VBS来做到这一点。但是最简单的方法是使用Powershell。您可以像这样从cmd.exe调用它
powershell -Command "(Get-ChildItem | Sort-Object { [regex]::Replace($_.Name, '\d+', { $args[0].Value.PadLeft(20) }) }).Name"
如果文件中包含更长的数字,那么您当然需要更改PadLeft(20)
中的数字
How to sort by file name the same way Windows Explorer does?
可以在以下位置找到本机批处理解决方案 Naturally Sort Files in Batch,如果文件末尾只有一个数字
@echo off
setlocal enabledelayedexpansion
for %%a in (*.txt) do (
set num=00000000000000000000%%a
set num=!num:~-20!
set $!num!=%%a
)
for /f "tokens=1,* delims==" %%a in ('set $0') do echo %%b
答案 4 :(得分:-1)
如果您受限于Windows原生的工具,您可以尝试Windows Scripting tools并执行类似使用FileSystemObject获取文件名的操作,并使用正则表达式提取文件名的数字部分以用作Dictionary对象中的键。我会将实际编码作为练习留给读者:)
答案 5 :(得分:-2)
不,没有办法做到这一点。 Windows资源管理器使用不同的方法来处理此问题。