【问题标题】:Drag and drop on bat file to automate exiftool拖放 bat 文件以自动化 exiftool
【发布时间】: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(见&amp;&amp;||
  • 我遵循了建议(编辑我的问题),但它仍然给出了同样的问题。一切正常,直到在选择语句之后,当它进入 :deleteOriginals 或 :restoreOriginals 部分时,cmd 显示 if "" == "" goto:end 并且程序结束而不执行所需的命令
  • 请记住:goto 不会“撤消”shift。您应该在第一个循环中执行条件执行:exiftool ... &amp;&amp; delete original || restore original 并跳过其余代码。
  • 啊我明白你的意思了......但我需要这样做,以便删除原始文件和恢复原始文件取决于用户输入(选择命令)。这不是以 exiftool 是否成功运行为条件(我什至不确定它是否输出真/假值)。我希望能够在单个批处理文件中执行此操作,而不必为 deleteOriginal 和 restoreOriginal 再创建 2 个
  • 想到的其他东西:exiftool 能够处理多个参数。有没有办法让拖放将每个文件显示为同一行的参数?例如exiftool "C:\...\fileA.pdf" "C:\...\fileB.pdf" "C:\...fileC.pdf"我觉得这会让一切变得更简单

标签: batch-file cmd exiftool


【解决方案1】:

我已经设法通过删除循环使其工作。仍然愿意接受有关走这条路的建议,但这似乎可行:

"C:\Users\Alessio\Desktop\Programmazione\Exiftools\exiftool.exe" "-title<${filename;s/.[^.]*$//}" %*

choice /C YN /M "I file sono stati rinominati correttamente?"
if "%errorlevel%" == "1" goto:deleteOriginals
if "%errorlevel%" == "2" goto:restoreOriginals

:deleteOriginals
"C:\Users\Alessio\Desktop\Programmazione\Exiftools\exiftool.exe" -k -delete_original %*
exit

:restoreOriginals
"C:\Users\Alessio\Desktop\Programmazione\Exiftools\exiftool.exe" -k -restore_original %*
exit

我尝试使用此迭代代替 if 语句,但由于某种原因它不起作用,无法弄清楚原因:

choice /C YN /M "I file sono stati rinominati correttamente?" && goto:deleteOriginals || goto:restoreOriginals

【讨论】:

  • &amp;&amp; 识别退出代码为零,但 choice 将其设置为一、二等,具体取决于用户输入,因此始终是 ||;这就是为什么你需要if 条件......
  • 此外,考虑到通过拖放到批处理文件上的参数处理非常糟糕,因为文件路径仅在包含空格时才会被引用,但任何其他特殊字符(如&amp;^(),;=) 不受引号保护...
  • 有什么办法可以解决这个问题吗?还是批处理只是适合这项工作的错误工具?
猜你喜欢
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多