如何在Windowsbatch file中循环运行按名称顺序

我有一个Windowsbatch file,这样做:

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。 我怎样才能让它们按名称顺序运行?

它曾经工作,但现在没有。 什么可能会导致这个问题?

杰里的回答很可能是导致问题的原因。

你可以通过改变来解决它

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 

如果内存服务,它将按照文件系统返回的顺序对这些文件进行操作。 因此,如果您在使用NTFS格式化的磁盘分区上运行它,名称将按排序顺序返回,以便按排序顺序进行处理。 如果磁盘分区被格式化为FAT或FAT32之类的东西,这些名称将以一个或多或少的随机顺序被检索(和处理)。

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

 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"