【问题标题】:How to make for loop in windows batch file run in name order如何使Windows批处理文件中的for循环按名称顺序运行
【发布时间】:2011-04-06 02:39:28
【问题描述】:

我有一个执行此操作的 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。如何让它们按名称顺序运行?

以前可以,现在不行了。什么可能导致这个问题?

【问题讨论】:

    标签: sql windows loops batch-file


    【解决方案1】:

    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
    

    【讨论】:

    • 或者,for /f "usebackq" %%s in (`dir *.sql /b /ON`) do call
    • Patrick,您的解决方案会在空格后切断所有文件名,因此它只是部分有用。
    • Lieven,您的解决方案完全失败了。如果我用空格替换 ",它也会找到 "dir"、"|" 和 "sort"。所以这也不起作用。
    • @LonelyPixel - 我已经更新了答案,但正如我在编辑中提到的那样,我不知道它当时是否有效。 (OP 认为这是一个正确答案,所以我认为它确实如此).
    • @PatrickCuff 对于带空格的文件名,添加tokens=,如下所示:for /f "usebackq tokens=" %%s in (dir "my work dir\*.sql" /b /ON) do call
    【解决方案2】:

    如果内存可用,它将按照文件系统返回的顺序对文件进行操作。因此,如果您在使用 NTFS 格式化的磁盘分区上运行它,则名称将按排序顺序返回,因此它们将按排序顺序处理。如果磁盘分区使用 FAT 或 FAT32 之类的格式进行格式化,则名称将按或多或少的随机顺序检索(和处理)。

    【讨论】:

      【解决方案3】:

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

      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"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-21
        • 1970-01-01
        • 2021-10-26
        • 1970-01-01
        • 2013-10-07
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        相关资源
        最近更新 更多