Batch file 如何对放入批处理文件的参数进行排序?

Batch file 如何对放入批处理文件的参数进行排序?,batch-file,command-prompt,Batch File,Command Prompt,我正在编写一个批处理文件,该文件在所有目录中查找并执行所有update.bat文件 这里的问题是,我希望参数(即目录的路径)是按名称排序的,但事实证明它们是按修改日期排序的 这是Windows(Windows 7)的默认行为吗?有解决这个问题的建议吗 以下是我的批处理脚本: @echo off Setlocal EnableDelayedExpansion if [%1]==[] goto :no_update_dropped set LOG_FILE=update_log.txt ec

我正在编写一个批处理文件,该文件在所有目录中查找并执行所有
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

致以最诚挚的问候。

我将更改输入集

您可以使用上的/on按名称排序并获取目录

/ad
因此,按名称列出的所有目录=

dir /ad /on 

我将更改输入集

您可以使用上的/on按名称排序并获取目录

/ad
因此,按名称列出的所有目录=

dir /ad /on 

您可以在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???),所以你必须去掉它。我改了密码

最后借助于此:

for /f "delims=" %%a in ('cmd /c "for %%i in (%*) do @echo %%~i"^|sort') do (
    echo use "%%a"
)
p.p.S这应该在名称中使用逗号时更安全(当然,它们必须被引用)


您可以在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???),所以你必须去掉它。我改了密码

最后借助于此:

for /f "delims=" %%a in ('cmd /c "for %%i in (%*) do @echo %%~i"^|sort') do (
    echo use "%%a"
)
p.p.S这应该在名称中使用逗号时更安全(当然,它们必须被引用)


文件夹的显示顺序由调用批处理文件的人(或任何人)控制。批处理脚本与订单无关。如果需要,您可以在批处理中对参数列表进行排序,但是调用方可能应该以正确的顺序传递它们。我选择所有文件夹dir1、dir2、dir3、dir4并放到批处理文件中,参数的顺序是dir4、dir1、dir2、dir3。文件夹的显示顺序由调用批处理文件的人(或任何人)控制。批处理脚本与订单无关。如果需要,您可以在批处理中对参数列表进行排序,但是调用方可能应该以正确的顺序传递它们。我选择了所有文件夹dir1,dir2,dir3,dir4并放到批处理文件中,参数的顺序是dir4,dir1,dir2,dir3。哇,这真的很有帮助。谢谢这不适用于名称中包含空格的文件夹。你有什么解决办法吗?所有这些删除引号、删除空格和添加引号的麻烦都是为了使其能够处理名称中包含空格的文件夹。这是解决办法。使用参数“第2个文件夹”“第1个文件夹”运行此批处理会生成“第1个文件夹”“第2个文件夹”,作为“!dirname!”表达式的结果。至于批处理文件的其余部分与包含空格的名称的兼容性,有一些人对此表示怀疑,我在其中没有看到任何引用。(实际上,你当然需要双引号)。谢谢你在回答中保留了你的原始代码片段。第二个是嵌入了“cmd/c”的循环,它去掉了文件或目录名中的任何逗号,而使用“sort”的循环则没有。@JeffreyFox不会去掉,而是用空格替换,即使在名称中也是如此。不知道发生了什么,但我可能找到了解决办法哇,这真的很有帮助。谢谢这不适用于名称中包含空格的文件夹。你有什么解决办法吗?所有这些删除引号、删除空格和添加引号的麻烦都是为了使其能够处理名称中包含空格的文件夹。这是解决办法。使用参数“第2个文件夹”“第1个文件夹”运行此批处理会生成“第1个文件夹”“第2个文件夹”,作为“!dirname!”表达式的结果。至于批处理文件的其余部分与包含空格的名称的兼容性,有一些人对此表示怀疑,我在其中没有看到任何引用。(实际上,你当然需要双引号)。谢谢你在回答中保留了你的原始代码片段。第二个是嵌入了“cmd/c”的循环,它去掉了文件或目录名中的任何逗号,而使用“sort”的循环则没有。@JeffreyFox不会去掉,而是用空格替换,即使在名称中也是如此。不知道发生了什么,但我可能找到了解决办法