【问题标题】:How to list files using DIR or similar tool by alphanumeric in batch? [duplicate]如何使用 DIR 或类似工具按字母数字批量列出文件? [复制]
【发布时间】:2026-02-17 17:10:02
【问题描述】:

如何将我的文件列为123……111213 使用DIR 或类似名称?

我在自动化批处理程序时遇到问题,因为该程序不断弄乱列表编号。

欢迎任何其他工具,只要它可以批量应用。

我的输出:

dir /b /a-d "..\test\*.jpg
(1).jpg
(10).jpg
(11)..jpg
(12).jpg
(2)..jpg
(3).jpg
(4).jpg
(5)..jpg
(6).jpg
(7).jpg
(8)..jpg
(9).jpg

我希望它输出如下:

dir /b /a-d "..\test\*.jpg
(1).jpg
(2)..jpg
(3).jpg
(4).jpg
(5)..jpg
(6).jpg
(7).jpg
(8)..jpg
(9).jpg
(10).jpg
(11)..jpg
(12).jpg

【问题讨论】:

  • 这对于简单的dir 命令行是不可能的; dir 没有 /O 选项通常会返回从文件系统报告的项目(我猜它是 NTFS,因为列表似乎是按字母顺序排序的);使用 dir /O:N 不会在这里改变任何东西,因为这也适用于字母排序;您正在寻找的是字母数字排序,因此数字是专门识别的......
  • @aschipfl 还有其他可以专门在 Windows 上使用的替代方案吗?只要它存在于 Windows 上,我真的不介意其他方式。我的简单解决方法是将 0 附加到单个数字。
  • @SazeimSaheem,然后请更改您的问题,因为它明确指出,“使用DIR
  • *.com/questions/51672351/…。你需要逻辑排序。不在dirsort 命令中。
  • @SazeimSaheem,我看到你已经编辑了你的问题,但仍然坚持答案必须使用 DIR 命令。这是你必须拥有的吗?

标签: batch-file cmd directory


【解决方案1】:

使用纯 Windows / 功能,您可以通过在每一行前面加上文件名中的数字在左侧填充零(因此它们具有固定宽度)和一个分隔符来扩充列表不能出现在文件名中,使用sort 进行字母排序(这导致固定宽度数字的结果相同)并删除临时前缀,然后是 ‐像这样,例如:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_ROOT=%~1"                      & rem // (root directory; `%~1` is first argument)
set "_MASK=(*).jpg"                  & rem // (pattern to search for files)
set "_TMPF=%TEMP%\%~n0_%RANDOM%.tmp" & rem // (path to a temporary file)

rem // Write to temporary file:
> "%_TMPF%" (
    rem // Read output of `dir` command line and loop through the returned file names:
    for /F "delims= eol=|" %%F in ('dir /B /A:-D "%_ROOT%\%_MASK%"') do (
        rem // Store current file name:
        set "FILE=%%F"
        rem // Toggle delayed expansion to avoid loss of `!` (just in case):
        setlocal EnableDelayedExpansion
        rem // Extract number (beginning from second character position) and pad it:
        set "NUM=!FILE:~1!" & set /A "NUM+=0" & set "NUM=0000000000!NUM!"
        rem // Output left-zero-padded number plus `|` plus original file name:
        echo(!NUM:~-10!^|!FILE!
        endlocal
    )
)
rem // Let `sort` bring the list in alphabetic order and loop through the lines:
for /F "tokens=2 delims=|" %%L in ('sort "%_TMPF%"') do (
    rem // Return the original file name and ignore everything in front of `|`:
    echo(%%L
)
rem // Clean up the temporary file:
del "%_TMPF%"

endlocal
exit /B

【讨论】:

    最近更新 更多