【发布时间】:2020-11-18 07:24:08
【问题描述】:
我正在尝试使用一个非常简单的批处理文件来自动化 PDF 标题的编辑。我希望能够拖放一系列文件并让 cmd 为每个文件运行 exiftool。运行命令后,我想显示一条消息,询问编辑是否成功,在第一种情况下,我将删除从 exiftools 创建的 _original 备份文件,在第二种情况下,我将恢复它们。这是我写的:
:renaming
if "%~1" == "" goto:done
"C:\Users\Alessio\Desktop\Programmazione\Exiftools\exiftool.exe" "-title<${filename;s/.[^.]*$//}" "%~1"
shift
goto:renaming
:deleteOriginals
if "%~1" == "" goto:end
"C:\Users\Alessio\Desktop\Programmazione\Exiftools\exiftool.exe" -restore_original "%~1"
shift
goto:deleteOriginals
:restoreOriginals
if "%~1" == "" goto:end
"C:\Users\Alessio\Desktop\Programmazione\Exiftools\exiftool.exe" -delete_original "%~1"
shift
goto:restoreOriginals
:done
shift /1
choice /C YN /M "I file sono stati rinominati correttamente?" && goto:deleteOriginals || goto:restoreOriginals
:end
pause
看来,一旦我通过拖放获得的参数循环一次,我就不能只调用 shift /%1 来回到开始。我该怎么做?我试图摆弄 set 命令,但运气不佳。如果批处理无法做到这一点,我在想也许我可以让 exiftool 创建一个包含所有路径的文本文件,并让 cmd 从那里加载参数并最终删除它。提前致谢
【问题讨论】:
-
当我理解正确时,你想要conditional executing(见
&&和||) -
我遵循了建议(编辑我的问题),但它仍然给出了同样的问题。一切正常,直到在选择语句之后,当它进入 :deleteOriginals 或 :restoreOriginals 部分时,cmd 显示
if "" == "" goto:end并且程序结束而不执行所需的命令 -
请记住:
goto不会“撤消”shift。您应该在第一个循环中执行条件执行:exiftool ... && delete original || restore original并跳过其余代码。 -
啊我明白你的意思了......但我需要这样做,以便删除原始文件和恢复原始文件取决于用户输入(选择命令)。这不是以 exiftool 是否成功运行为条件(我什至不确定它是否输出真/假值)。我希望能够在单个批处理文件中执行此操作,而不必为 deleteOriginal 和 restoreOriginal 再创建 2 个
-
想到的其他东西:exiftool 能够处理多个参数。有没有办法让拖放将每个文件显示为同一行的参数?例如
exiftool "C:\...\fileA.pdf" "C:\...\fileB.pdf" "C:\...fileC.pdf"我觉得这会让一切变得更简单
标签: batch-file cmd exiftool