按批文件名前缀的顺序读取目录中的文件?

我在一个目录中有许多SQL脚本,前面加了一个数字,例如

在这里输入图像说明

目前,我可以用这个脚本循环它们:

@ECHO OFF FOR /r . %%F IN (*.sql) DO ( ECHO File:"%%F" ) 

但是,由于Windows读取目录中的文件的方式,10和11是在2之前读取的:

在这里输入图像说明

我如何循环目录中的每个文件, 按照前缀的顺序

下面的批处理文件在需要它的文件名中插入前导零。

 @echo off setlocal EnableDelayedExpansion for /F "delims=" %%f in ('dir /B *.sql') do ( set "filename=%%f" if "!filename:~1,1!" equ "-" ren "%%f" "0%%f" ) 

编辑 :添加新的解决方案

下面的批处理文件按照正确的顺序显示文件,而不用重命名它们。

 @echo off setlocal EnableDelayedExpansion rem Create an array with filenames in right order for %%f in (*.sql) do ( for /F "delims=-" %%n in ("%%f") do ( set "number=00000%%n" set "file[!number:~-6!]=%%f" ) ) rem Process the filenames in right order for /F "tokens=2 delims==" %%f in ('set file[') do ( echo %%f ) 

替代方法!

这不是你的问题的直接答案,但可能会达到相同的结果:

 FOR /L %%i IN (1,1,11) DO FOR %%f IN (%%i-*.sql) DO ECHO %%f 

据我所知,没有FOR标志。

但这里是纯粹的PowerShell解决方案使用某种怪异的正则表达式。

或者您可以列出文件, 对它们进行排序 ,将这些排序后的路径按照正确的顺序排列,然后读取。

第三个解决方案将尝试使用标准Windows Shell命令和运算符来构建一些排序功能。

编辑 – 使用JSORT.BAT的新的简单解决方案

本地批处理SORT命令是非常有限的。 我写了一个方便的JSORT.BAT排序实用程序 ,它提供了许多方便的功能,包括根据数字值对字符串进行排序的能力。 JSORT.BAT是纯脚本(混合JScript /批处理),可以在任何Windows机器上本地运行,而不需要任何第三方exe文件。

您可以使用数字列出文件

 dir /b /ad *.sql^|jsort /n /i 

如果要迭代结果,只需将该命令放在FOR / F循环中即可

 for /f "delims=" %%F in ('dir /b /ad *.sql^|jsort /n /i') do echo %%F 

完整的文档可以从命令行使用jsort /?

早于JSORT.BAT的原始解决方案

如果你使用名为REPL.BAT的混合JScript /批处理实用程序执行正则表达式搜索并替换标准输入并将结果写入标准输出,就可以在不修改文件名的情况下做批量操作。 该实用程序是从任何Windows操作系统上运行的纯脚本 – 不需要任何第三方可执行文件。 完整的文档嵌入在脚本中。

假设REPL.BAT在你的当前目录中,或者更好,在PATH中的某个地方,那么下面的代码将以所需的排序顺序迭代以一个数字开头的.sql文件。 正如所写,它支持长达5位数的数字。 它可以很容易地扩展到支持更大的数字。

 @echo off for /f "tokens=2 delims=:" %%F in ( 'dir /b /ad *.sql^|repl "^(\d+).*" "00000$1:$&" a^|repl ".*(\d{5}:)" "$1"^|sort' ) do echo %%F 

这真的显示了管道的力量:)

复杂的IN()子句的工作原理如下:

  1. 列出所有.sql文件
  2. 查找以数字开头的文件,并将每个匹配的名称替换为以五位前导零为前缀的前导号码,后跟一个冒号,后跟原始名称
  3. 替换前导号码,只保留最后5位数字
  4. 对结果进行排序

父母FOR / F然后读取结果,解析出原始文件名作为第二个:定界的标记。

根据需要用前导0来重命名您的脚本,以便始终在前缀中具有相同的数字位数。

Take Command Console是一个具有免费版本的命令解释器,并且会进行自然排序。