首页 > 解决方案 > 如何对 Windows 10 批处理文件中的参数列表进行排序

问题描述

我需要调用一个带有文件名列表的程序,但我需要找到并提取列表中的第一个文件作为排序顺序,然后将其余文件传递给程序。

具体来说,我想传递使用 QTTabbar 应用程序启动器选择的文件列表并执行 exiftool,以便列表中的第一个文件用于“-TagsFromFile”选项,然后处理所有其余文件,以便它们应用“-AllDates”选项。所以我的第一次尝试是:

exiftool -TagsFromFile %1 -AllDates %*

这会将第一个文件放在列表中,但由于 exiftool 会将其设置为与已有文件相同的值,因此这是可以接受的。

但是,我发现 QTTabbar 没有按照我所期望的按名称按字典顺序将参数传递给批处理文件。所以我想我需要对列表进行排序。

我在如何对放入批处理文件的参数进行排序中找到了对参数进行排序的方法?但是在该解决方案中,有一个循环,并且为每个参数调用一次程序,而不是构建一个新的参数列表。

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

我需要构建一个可以传递给 exiftool 的新参数列表,而不是“echo use”%%a”。理想情况下,我可以构建一个列表,然后用新的参数列表替换原始参数列表,例如“set”命令在 Bash 中。如果做不到这一点,我可以构建一个新列表并使用它,但我不知道如何构建一个列表,也不知道如何引用第一个元素(如果有的话)。

我该怎么做呢?

编辑:在文件资源管理器 GUI 中选择文件。它们出现在批处理文件中的顺序由 Windows 决定。这是批处理文件中“echo %*”的输出:

"C:\Users\user1\Desktop\setAB.test\00000920.jpg" "C:\Users\user1\Desktop\setAB.test\00000913.jpg" "C:\Users\user1\Desktop\setAB.test\00000914.jpg" "C:\Users\user1\Desktop\setAB.test\00000915.jpg" "C:\Users\user1\Desktop\setAB.test\00000916.jpg" "C:\Users\user1\Desktop\setAB.test\00000917.jpg" "C:\Users\user1\Desktop\setAB.test\00000918.jpg" "C:\Users\user1\Desktop\setAB.test\00000919.jpg"

如您所见,最后一个文件首先出现。我不知道为什么。有时它们的顺序相反。

因此,批处理文件被调用为:

ex.bat "C:\Users\user1\Desktop\setAB.test\00000920.jpg" "C:\Users\user1\Desktop\setAB.test\00000913.jpg" "C:\Users\user1\Desktop\setAB.test\00000914.jpg" "C:\Users\user1\Desktop\setAB.test\00000915.jpg" "C:\Users\user1\Desktop\setAB.test\00000916.jpg" "C:\Users\user1\Desktop\setAB.test\00000917.jpg" "C:\Users\user1\Desktop\setAB.test\00000918.jpg" "C:\Users\user1\Desktop\setAB.test\00000919.jpg"

我希望 exiftool 运行为:

exiftool -TagsFromFile "C:\Users\user1\Desktop\setAB.test\00000913.jpg" -AllDates "C:\Users\user1\Desktop\setAB.test\00000913.jpg" "C:\Users\user1\Desktop\setAB.test\00000914.jpg" "C:\Users\user1\Desktop\setAB.test\00000915.jpg" "C:\Users\user1\Desktop\setAB.test\00000916.jpg" "C:\Users\user1\Desktop\setAB.test\00000917.jpg" "C:\Users\user1\Desktop\setAB.test\00000918.jpg" "C:\Users\user1\Desktop\setAB.test\00000919.jpg" "C:\Users\user1\Desktop\setAB.test\00000920.jpg"

标签: batch-filewindows-10

解决方案


所以你的代码真的很接近。您只需要添加一些基本概念即可将第一个参数放入变量中,这可以通过检查变量是否已定义来完成。然后使用该SET命令将所有参数重新构建回另一个变量。如本问题所述,这需要延迟扩展。

@ECHO OFF
setlocal enabledelayedexpansion
set "first="
set "all="
for /f "delims=" %%a in ('cmd /c ^"for %%i in ^(%*^) do @echo %%~i^"^|sort') do (
    if not defined first set "first=%%~a"
    set "all=!all!"%%~a" "
)
exiftool -TagsFromFile "%first%" -AllDates %all%
endlocal

推荐阅读