【问题标题】:How to sort file names numerically in windows command line?如何在 Windows 命令行中对文件名进行数字排序?
【发布时间】:2023-03-20 01:51:01
【问题描述】:

Windows 资源管理器确实以正确的顺序显示。例如:filename1.txt、filename2.txt、filename11.txt 等。当我尝试使用不同选项的 DIR 命令时,无法获得相同的行为。它显示文件名1.txt、文件名11.txt、文件名2.txt。

有没有办法对其进行排序以保留数字顺序?

【问题讨论】:

  • 您已将此标记为 [dos] 和 [ms-dos],但我敢打赌您使用 DOS .您不可能在现代版本的 Windows 上这样做。但是,请务必告诉我们您使用的是 PowerShell 还是 Windows 命令提示符。
  • 我将标签更新为专门表示 Windows 命令行。 Windows 7 及更高版本就可以了。
  • 如果这不是 PowerShell 问题,这不是重复的,所以我重新打开了它。不幸的是,我认为这是不可能的。 Explorer 使用特殊函数 StrCmpLogical 进行排序,但命令提示符没有。它总是使用字典排序。您的解决方法是显而易见的,用 0 填充文件名。

标签: windows command-line command-prompt


【解决方案1】:
@ECHO Off
:: dir list in numeric-value order
SETLOCAL
:: %1= directoryname; default current directory
SET "targetdir=%~1"
IF NOT DEFINED targetdir SET "targetdir=.\*.*"
:: remove variables starting $
FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
SET /a maxnumlength=0
SET "manyzeroes=0000000000000000"
SET "manyzeroes=%manyzeroes%%manyzeroes%%manyzeroes%%manyzeroes%"
:: analyse list of filenames
FOR /f "delims=" %%a IN (
  'dir /b /a-d "%targetdir%" '
  ) DO CALL :detnlen "%%a"

:: build list of filenames
FOR /f "delims=" %%a IN (
  'dir /b /a-d "%targetdir%" '
  ) DO CALL :setname "%%a"

FOR  /F "tokens=1*delims=:" %%a In ('set $ 2^>Nul') DO ECHO %%b

GOTO :EOF

:detnlen
SET "name=%~1"
SET /a numlength=0
SET "action=L"
:detnloop
IF %action%==F SET "action=B"
SET "post=%name:~0,1%"&SET "name=%name:~1%"
IF "%post%" geq "0" IF "%post%" leq "9" (
 SET /a numlength+=1
 SET "action=F"
)
IF %action% neq B IF DEFINED name GOTO detnloop
IF %numlength% gtr %maxnumlength% SET /a maxnumlength=%numlength%
GOTO :EOF

:setname
SET "name=%~1"
SET "pre="
SET "nums="
SET "action=L"
:snloop
IF %action%==F SET "action=B"
SET "post=%name:~0,1%"&SET "name=%name:~1%"
IF "%post%" geq "0" IF "%post%" leq "9" (
 SET /a numlength+=1
 SET "action=F"
 SET "nums=%nums%%post%"
)
IF %action%==L SET "pre=%pre%%post%"&SET "post="
IF %action% neq B IF DEFINED name GOTO snloop ELSE SET "post="
IF %action%==F SET "post="
IF DEFINED nums SET "nums=%manyzeroes%%nums%"
IF DEFINED nums CALL SET "nums=%%nums:~-%maxnumlength%%%"
SET "$%pre%%nums%%post%%name%=:%~1"
GOTO :EOF

天哪!

没有内置的开关以这种奇怪的方式显示目录,但这具有挑战的所有特征。

好的 - 它非常慢,但它似乎工作。

原理是将初始数字的最长序列确定为maxnumlength,然后将检测到的文件的名称分配给以$开头的环境变量,名称由文件名构成,数字部分前导零-填充。 set $ 然后按字母顺序列出$ 变量;选择值,即原始文件名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-12
    • 2016-05-03
    • 2014-10-10
    • 2012-04-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多