如何让Windows批处理文件中的for循环按名称顺序运行

10

我有一个Windows批处理文件,它可以执行以下操作:

for %%s in (*.sql) do call

It loops through all the sql script in a folder.

In the folder the file names are like:
s4.06.01.sql
s4.07.01.sql
s4.08.01.sql
s4.10.01.sql
s5.01.sql

但是for循环随机遍历文件(不按名称顺序),首先运行s5.01,然后是s4.06,s4.08,s4.10,最后是s4.07。 如何让它们按名称顺序运行?

以前可以正常工作,现在却不行了。可能是什么原因导致这个问题?

3个回答

10

Jerry的答案很可能是导致问题的原因。

您可以通过更改

for %%s in (*.sql) do call

for %%s in (dir"*.sql ^| sort) do call

来解决它。


编辑 cudo向LonelyPixel致敬

发布的解决方案在Windows 8机器上不起作用(也许在Windows XP上它能够正常工作,但我不确定)

以下是使用Windows 8命令提示符的有效解决方案。

for /f "tokens=*" %%s in ('dir /b *.sql ^| sort') do echo %%s

3
或者,使用 for /f "usebackq" %%s in (dir *.sql /b /ON) do call - Patrick Cuff
Patrick,你的解决方案在空格后面截断了所有文件名,因此它只有部分有效。 - ygoe
1
Lieven,你的解决方案完全失败了。如果我用空格替换“”,它也会找到“dir”、“|”和“sort”。所以那也行不通。 - ygoe
@LonelyPixel - 我已经更新了答案,但正如我在编辑中提到的那样,我不知道它是否在过去起作用。 (OP接受了这个答案,所以我认为它确实有效)。 - Lieven Keersmaekers
@PatrickCuff 对于文件名中带有空格的情况,请添加 tokens=,像这样:for /f "usebackq tokens=" %%s in (dir "my work dir\*.sql" /b /ON) do call - Alexander Gelbukh
显示剩余2条评论

2
如果我没记错的话,它会按照文件系统返回的顺序操作文件。因此,如果你在NTFS格式的磁盘分区上运行它,名称将按排序顺序返回,因此它们将按排序顺序进行处理。如果磁盘分区格式为FAT或FAT32之类的格式,则名称将以更多或更少的随机顺序检索(并处理)。

1

我也不得不处理文件名中的空格,所以我像这样在输入变量周围添加了引号:

for /f "tokens=*" %%s in ('dir /b *.sql ^| sort') do echo "%%s"

在我的情况下,使用的是SQLCMD,并将脚本放在一个子目录中,如下所示:
SET "machineName=localhost"
for /f "tokens=*" %%f in ('dir /b PostDeployScripts\*.sql ^| sort') do sqlcmd -E -S%machineName% -i"PostDeployScripts\%%f"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接