Windows“dir”命令,按名称排序和< something>
题
我们可以在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
按名称排序,在那里读取数字就像人类一样?
解决方案
您最好的选择(如果可能)是在您的较小数字中添加足够的前导零(在本例中为两个),以便按预期排序。
其他提示
Windows资源管理器使用特殊的排序功能, StrCmpLogicalW , cmd.exe 不使用,因此输出的差异。不过,你可以用它编写自己的排序程序。
他是他。你们都想知道我的解决方案吗?
我正在使用一个名为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 命令通过升序(创建?)日期对目录内容进行排序,我们可以完全忽略实际的文件名。
目前还没有可以自然排序的内置命令行工具。如果您需要,请投票赞成该功能,让微软改变主意
然而,这可以通过正则表达式替换来模拟。在Windows上,您可以使用Jscript和VBS来执行此操作。但最简单的方法是使用PowerShell。您可以像cmd.exe这样从
中调用它powershell -Command "(Get-ChildItem | Sort-Object { [regex]::Replace(目前还没有可以自然排序的内置命令行工具。如果您需要,请投票赞成该功能,让微软改变主意
然而,这可以通过正则表达式替换来模拟。在Windows上,您可以使用Jscript和VBS来执行此操作。但最简单的方法是使用PowerShell。您可以像cmd.exe这样从
中调用它
@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 <*>') do echo %%b
当然,如果您的文件包含更长的数字系列,您需要更改 PadLeft(20)
中的数字
可以在中找到本机批处理解决方案
如果您的文件最后只有一个数字,请自然地批量文件排序
<*>.Name, '\d+', { $args[0].Value.PadLeft(20) }) }).Name"
当然,如果您的文件包含更长的数字系列,您需要更改 PadLeft(20)
中的数字
可以在中找到本机批处理解决方案 如果您的文件最后只有一个数字,请自然地批量文件排序
<*>如果您受限于Windows原生的工具,您可以尝试 Windows Scripting工具,并使用FileSystemObject获取文件名,使用正则表达式提取文件名的数字部分,以用作Dictionary对象中的键。我会将实际编码作为练习留给读者:)
不,没有办法做到这一点。 Windows资源管理器使用不同的方法来处理此问题。