Windows 视窗';目录';命令、按名称排序和<;某物>;

Windows 视窗';目录';命令、按名称排序和<;某物>;,windows,cmd,directory,Windows,Cmd,Directory,我们可以在Windows资源管理器中按名称排序的目录中看到文件 如果我在Windows命令提示符中尝试相同的操作,它会按名称进行不同的排序-正确: 有没有一种方法可以让dir按姓名排序,它可以像人类那样读取数字?没有,没有办法。Windows资源管理器使用不同的方法来处理此问题。您最好的选择(如果可能的话)是在较小的数字上添加足够的前导零(在本例中为两个),以便按预期进行排序 Windows资源管理器使用一个特殊的排序函数,cmd.exe不使用该函数,因此在输出中存在差异。不过,您可以用它编写自

我们可以在Windows资源管理器中按名称排序的目录中看到文件

如果我在Windows命令提示符中尝试相同的操作,它会按名称进行不同的排序-正确:


有没有一种方法可以让dir按姓名排序,它可以像人类那样读取数字?

没有,没有办法。Windows资源管理器使用不同的方法来处理此问题。

您最好的选择(如果可能的话)是在较小的数字上添加足够的前导零(在本例中为两个),以便按预期进行排序

Windows资源管理器使用一个特殊的排序函数,cmd.exe不使用该函数,因此在输出中存在差异。不过,您可以用它编写自己的排序程序

您可能还对Michael Kaplan(来自Raymond Chen的)上的条目感兴趣。

4NT/TCC/TC默认使用自然排序顺序。或者,如果您可以访问GNU
sort
程序,例如,您可以执行类似于
ls-1 |/bin/sort-g
dir/b |\cygwin\bin\sort-g
的操作;这将按自然排序顺序为您提供文件名


如果您受限于Windows本机工具,则可以尝试并执行以下操作:使用a获取文件名,使用正则表达式提取文件名的数字部分以用作Dictionary对象中的键。我将把实际的编码作为练习留给读者:)

他。你们都想知道我的解决方案吗

我正在使用一个名为ImageMagick的程序将我的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/ODN/B>files.txt
对于('dir*.jpg/ODN/B')中的/f“tokens=*”%%a(
echo^%%a^>>pages.xml.fragment
)
因此,
dir*.jpg/OD
命令按升序(创建?)日期对目录内容进行排序,我们可以完全忽略实际的文件名。

这称为。目前还没有能够自然排序的内置命令行工具。如果你想让微软改变主意

然而,这可以通过正则表达式替换来模拟,以填充零,使数字具有相同的长度。这样一来,a就相当于一种自然类型。在Windows上,您可以使用Jscript和VBS来实现这一点。但最简单的方法是使用powershell。您可以像这样从cmd.exe调用它

powershell-Command“(Get ChildItem | Sort Object{[regex]::Replace($).Name,'\d+',{$args[0].Value.PadLeft(20)})。Name”
当然,如果文件包含更长的数字序列,则需要更改
PadLeft(20)
中的数字

可以在中找到本机批处理解决方案 如果文件末尾只有一个数字

@echo关闭
延迟扩展
对于(*.txt)中的%%a,请执行以下操作(
set num=00000000000000%%a
set num=!num:~-20!
设置$!num!=%%a
)
对于/f“tokens=1,*delims==”%%a in('set$0')do echo%%b

Jeff Atwood在这里的一篇博文中讨论了这一点:@JonLimjap链接重定向到Jeff博客的主页@steenhulthin令人震惊!!阿特伍德决定改变主意,并在这个过程中欺骗所有人。@steenhulthin抱歉,这是一个5年前的评论,所以链接可能会过时。更新后的链接在这里:如果我曾预期需要按顺序处理文件,我将填充1到4个前导零或使用完整的UTC格式时间戳20081028143531。这是一个老把戏,可以追溯到70年代末或80年代初。也许在那之前……我很确定最后的修改日期(不是创建日期)用于“dir/od”。对于创建日期,您需要“dir/tc/od”。
dir *.jpg /ODN /B > files.txt

for /f "tokens=*" %%a in ('dir *.jpg /ODN /B') do (
    echo ^<page^>%%a^</page^> >>pages.xml.fragment
)