如何对丢弃到批处理文件的参数进行排序?

时间:2012-06-08 04:34:02

标签: 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

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

最诚挚的问候。

2 个答案:

答案 0 :(得分:5)

您可以在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
)

P.S。似乎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"
)

答案 1 :(得分:0)

我会改变输入集。

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

/ad

所有目录按名称=

dir /ad /on