【问题标题】:How to sort the arguments dropped to a batch file?如何对放入批处理文件的参数进行排序?
【发布时间】:2012-06-12 04:10:13
【问题描述】:

我正在编写一个批处理文件,用于查找并执行所有放在它上面的目录中的所有 update.bat 文件。

这里的问题是我希望参数(即目录的路径)按名称排序,但事实证明它们是按修改日期排序的。

这是 Windows (Windows 7) 的默认行为吗?有什么解决这个问题的建议吗?


这是我的批处理脚本:

@echo off
Setlocal EnableDelayedExpansion

if [%1]==[] goto :no_update_dropped

set LOG_FILE=update_log.txt

echo You are about to run these updates:
for %%G IN (%*) do (
  if exist %%~sG\NUL echo %%G
)

pause

for %%G IN (%*) do (
  if exist %%G\NUL (
        if exist %%G\update.bat (
            call %%G\update.bat %LOG_FILE%
        ) else (
            echo No update.bat found in %%G.
            goto :no_batch_found
        )
    )
)
goto :success

:no_update_dropped
echo NO UPDATE FOLDER FOUND
echo Drag and drop one or more update folder to run.
goto :exit

:no_batch_found
echo UPDATE NOT COMPLETED!
goto exit

:success
echo all updated has been run successfully
goto :exit

:exit
pause

最好的问候。

【问题讨论】:

  • 文件夹出现的顺序由调用批处理文件的人(或其他人)控制。您的批处理脚本与订单无关。如果需要,您可以对批处理中的参数列表进行排序,但也许调用者应该以正确的顺序传递它们。
  • 不过,我确实对其进行了测试。我选择所有文件夹 dir1, dir2, dir3, dir4 并放到批处理文件中,参数的顺序是 dir4, dir1, dir2, dir3。

标签: batch-file command-prompt


【解决方案1】:

您可以像这样在 for 循环中对参数列表进行排序:

setlocal enabledelayedexpansion
for /f "delims=" %%a in ('(for %%i in (%*^) do @echo %%~i^)^|sort') do (
    set dirname=%%a
    set dirname=!dirname:~0,-1!
    echo use "!dirname!" without the trailing space
)

附:似乎sort 在字符串末尾附加了一个空格,(WTF ????)所以你必须摆脱它。我改了代码。

最后dbenham's explanation的帮助下变成了:

for /f "delims=" %%a in ('cmd /c "for %%i in (%*) do @echo %%~i"^|sort') do (
    echo use "%%a"
)

P.P.S 这应该在名称中使用逗号更安全(当然,它们必须被引用)

for /f "delims=" %%a in ('cmd /c ^"for %%i in ^(%*^) do @echo %%~i^"^|sort') do (
        echo use "%%a"
)

【讨论】:

  • 哇,这真的很有帮助。谢谢!
  • 这不适用于名称中包含空格的文件夹。你有什么解决办法吗?
  • 所有这些关于删除引号、删除空格和添加引号的大惊小怪都是专门为使其适用于名称包含空格的文件夹而完成的。这解决方法。使用参数 "2nd folder" "1st folder" 运行此批处理会产生 "1st folder" "2nd folder" 作为 "!dirname!" 的结果表达。至于批处理文件的其余部分与包含空格的名称的兼容性 - 对此存在某些疑问,我还没有看到其中的 single 引用。 (实际上。当然,您需要 引号)。
  • 感谢您在答案中保留原始代码 sn-p。第二个嵌入了“cmd /c”,去除文件或目录名中的任何逗号,而使用“sort”的循环不会。
  • @JeffreyFox,它不会删除,而是用空格替换它们,即使在名称内部也是如此。不知道发生了什么,但我可能找到了解决方案
【解决方案2】:

我会改变输入集。

您可以使用/on按名称订购并获取目录

/ad

所以所有目录按名称=

dir /ad /on 

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2013-07-26
    • 2021-05-21
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多