batch-file - 如何对 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"
解决方案
所以你的代码真的很接近。您只需要添加一些基本概念即可将第一个参数放入变量中,这可以通过检查变量是否已定义来完成。然后使用该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
推荐阅读
- c++ - 如何排序QTableView忽略大小写
- static-libraries - 静态库包含来自其他头文件的未定义引用#define
- c# - 如何在 IIS 中使用个人智能卡(x509 证书)
- php - 更新具有相同日期键值的数组元素
- c# - 无法安装 nuget 包 - 找不到包错误
- ios - 我想制作一个与漫威所有事物相关的每日随机事实应用程序。这将是大量的事实,那么存储所有数据的最佳方式是什么?
- mysql - 使用 MySQL Workbench 添加时字符串值不正确
- javascript - 获取 rangeError 超出最大调用堆栈大小
- teamcity - 标记提交/构建以进行部署
- sapb1 - SAP B1 - 组件项目不能是虚拟错误