Pandoc Windows 批处理文件构建错误路径 openBinary 文件不存在

Pandoc Windows batch file builds wrong path openBinary file does not exist

问题

这可能只是由于对 Windows 批处理文件编码缺乏深刻理解。

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

pandoc: C:_ALL\_ALL\accomp\testing-accomp-2017.05170505.md: openBinaryFile: does not exist (No such file or directory)

我为目录中的每个文件(大约 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 post:

我已经尝试过的

基本上,上面链接中的相同答案有大约四种变体 post,我已经尝试了每一种变体。

错误是由于目录名!accomp.delayed expansion和感叹号!造成的。

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

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

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

由于感叹号,字符串 !accomp\testing-accomp-2017.05170505.doc" -o "C:\_ALL\! 在这里被完全误解了。所以最后执行的是:

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

并且文件 C:\_ALL\_ALL\accomp\testing-accomp-2017.05170505.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/ 了解原因。