【问题标题】:Pandoc Windows batch file builds wrong path openBinary file does not existPandoc Windows批处理文件构建路径错误openBinary文件不存在
【发布时间】:2018-11-07 05:57:10
【问题描述】:

问题

这可能只是源于对 Windows 批处理文件编码缺乏深入的了解。

我正在尝试编写一个简单的单行批处理文件,它将使用pandoc 处理目录中的每个文件,以将所有 doc 或 docx (MS Word) 文件转换为 markdown (.md) 文件。当我运行批处理文件时,出现以下错误:

pandoc: C:_ALL\_ALL\accomp\testing-accomp-2017.05\20170505.md: openBinaryFile: 不存在(没有这样的文件或目录)

对于目录中的每个文件,我都会遇到这些错误之一(大约 25 个左右)。

我在其中运行命令的目录如下所示:

C:\_ALL\!accomp\testing-accomp-2017.05

如您所见,由于某种原因,_ALL 出现了两次。由于某种原因,它显示的路径不正确,我不确定这是 pandoc 问题还是 CMD 批处理文件编程问题。

我的密码

这是我的批处理文件的代码:

@echo OFF

:: [Not sure what this does, but have read that it is necessary]
setlocal enabledelayedexpansion

:: MAIN
FOR /r "." %%i IN (*.doc *.docx) DO pandoc -f rst -t markdown "%%~fi" -o "%%~dpni.md"

:: End with a pause so user can copy any text from screen.
ECHO. Done. Press any key to terminate program
PAUSE>NUL

现在,我不确定所有这些代码行的作用,据我所知,它们可能完全没有必要。然而,这里主要和最重要的代码是以For ... 开头的代码,它的灵感来自这篇 Stack Overflow 帖子:

我已经尝试过什么

基本上,在上述链接的帖子中,同一个答案大约有四种变体,我已经尝试了每一种变体。

【问题讨论】:

  • @aschipfl 感谢您的链接,我已经知道这就是为什么,您会注意到,我在文本中没有将 CMD 称为 DOS。我将问题标记为“DOS”,因为了解 DOS 的人也很可能理解 CMD,因此我不希望排除可以根据语义提供有用答案的人。
  • 我明白你的意思,但我不同意,因为与 CMD 相比,DOS 命令提示符的功能非常有限(尽管我不得不承认他们有同根)。因此,将 CMD 问题标记为 DOS 对我来说似乎有点不足(这就像问一个 C++ 问题并将其标记为 C 一样)...
  • @aschipfl 我明白你的意思,这与 C++ 与 C 的类比是有道理的。假设我要实现的代码是针对 CMD 的,你能告诉我它有什么问题吗?我认为这与变量扩展有关,但每次我试图理解我都会感到困惑。

标签: batch-file cmd pandoc file-conversion


【解决方案1】:

错误是由delayed expansion和目录名!accomp中的感叹号!引起的。

FOR 执行的命令行在文件20170505.doc 执行期间扩展为:

pandoc -f rst -t markdown "C:\_ALL\!accomp\testing-accomp-2017.05\20170505.doc" -o "C:\_ALL\!accomp\testing-accomp-2017.05\20170505.md"

由于启用了延迟的环境变量扩展,此命令行在执行前由 Windows 命令处理器第二次解析,搜索 !variable! 引用并将其替换为引用变量的值。

字符串!accomp\testing-accomp-2017.05\20170505.doc" -o "C:\_ALL\! 在这里被完全误解了,因为有感叹号。所以最终执行的是:

pandoc -f rst -t markdown "C:\_ALL\\_ALL\accomp\testing-accomp-2017.05\20170505.md"

并且文件C:\_ALL\\_ALL\accomp\testing-accomp-2017.05\20170505.md不存在。

解决方案是删除setlocal enabledelayedexpansion,因为这里不需要,因为 FOR 命令行上没有使用环境变量。

@ECHO OFF

FOR /r "." %%i IN (*.doc *.docx) DO pandoc.exe -f rst -t markdown "%%i" -o "%%~dpni.md"

:: End with a pause so user can copy any text from screen.
ECHO Done. Press any key to terminate program ...
PAUSE>NUL

循环变量i 在这里已经保存了完整的限定文件名。因此"%%~fi" 可以替换为"%%i"

最好使用ECHO/ 而不是ECHO.,尽管这里既不需要. 也不需要/。原因见 DosTips 论坛主题ECHO. FAILS to give text or blank line - Instead use ECHO/

【讨论】:

  • 谢谢莫菲!延迟扩张确实是问题所在。我删除了setlocal 行并最终使用了这个命令FOR /r "." %%i IN (*.doc *.docx) DO pandoc "%%~fi" -o "%%~dpni.md",它运行良好。将答案标记为正确。
  • 再次感谢您的帮助!我已经在我的 GitHub 存储库中发布了结果文件:github.com/codewizard13/batch-convert-pandoc/blob/master/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 2019-08-21
相关资源
最近更新 更多