我有一个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。如何让它们按名称顺序运行?
它曾经工作,但现在却没有。什么可能导致这个问题?
答案 0 :(得分:4)
杰里的回答很可能是导致问题的原因。
您可以通过更改
来解决此问题 for %%s in (*.sql) do call
到
for %%s in (dir"*.sql ^| sort) do call
编辑 cudo's to LonelyPixel
发布的解决方案不能像在Windows 8计算机上那样工作(也许它当时用Windows XP做了但我不知道)。
以下是使用Windows 8命令提示符的工作解决方案。
for /f "tokens=*" %%s in ('dir /b *.sql ^| sort') do echo %%s
答案 1 :(得分:2)
如果内存服务,它将按照文件系统返回的顺序对文件进行操作。因此,如果在使用NTFS格式化的磁盘分区上运行它,则将按排序顺序返回名称,以便按排序顺序处理它们。如果磁盘分区的格式为FAT或FAT32,则将以或多或少的随机顺序检索(和处理)名称。
答案 2 :(得分: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"