【发布时间】:2021-07-07 13:37:23
【问题描述】:
我需要调用一个带有文件名列表的程序,但我需要找到并提取列表中的第一个文件,并按照排序顺序将其余文件传递给程序。
具体来说,我想传递使用 QTTabbar 应用程序启动器选择的文件列表并执行 exiftool,以便列表中的第一个文件用于“-TagsFromFile”选项,然后处理所有其余文件以便他们应用“-AllDates”选项。所以我的第一次尝试是:
exiftool -TagsFromFile %1 -AllDates %*
这会将第一个文件放在列表中,但由于 exiftool 会将其设置为与已有的相同的值,因此这是可以接受的。
但是,我发现 QTTabbar 并没有按照我的预期将参数按名称按字典顺序传递给批处理文件。所以我想我需要对列表进行排序。
我找到了对How to sort the arguments dropped to a batch file? 中的参数进行排序的方法,但在该解决方案中存在一个循环,并且为每个参数调用一次程序,而不是构建一个新的参数列表。
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"
【问题讨论】:
-
打开命令提示符窗口,输入
shift /?并按下[ENTER]键,阅读可能对您有用的命令。如果您要向我们提供一些示例输入,准确解释该输入是如何传递给脚本的,并向我们准确显示 exiftool 命令以及按所需顺序完成这些输入等,它也会对我们有很大帮助。 -
这种转变没有帮助,因为原始顺序不正确。例如: ex.bat f4 f3 f8 f7 f6 f1 f2 f5 在 ex.bat 文件中我需要像这样调用 exiftool:exiftool -TagsFromFile f1 -AllDates f2 f3 f4 f5 f6 f7 f8 可选地 f1 也可以出现在第二个设置为 f1 f2 f3 f4 f5 f6 f7 f8.
-
您能否发布一个真实世界的示例,说明正在传递到批处理文件中的内容。您的伪示例存在缺陷,因为 F10 将使用 SORT 命令在 F1 之后和 F2 之前进行排序。
-
您被要求向我们展示您是如何将输入传递给批处理文件的。如果您在命令行中输入它,如您的示例所示,请以正确的顺序输入它。如果该参数列表是由另一个命令或程序提供的,那么请向我们展示产生它的命令。现在,与您之前的评论不同,您上面的评论将所有这些参数都提供为双引号,请具体说明,在获得强大的解决方案时确实很重要。
-
那么根据提供给批处理的参数,
EXIFTOOL命令应该是什么样子?再次使用您提供的真实示例和edit 您的问题。请您花点时间阅读How to Ask 一个好问题。
标签: batch-file windows-10