问题
这可能只是源于对 Windows 批处理文件编码缺乏深入理解。
我正在尝试编写一个简单的单行批处理文件,它将使用 pandoc 处理目录中的每个文件。将所有 doc 或 docx (MS Word) 文件转换为 markdown (.md) 文件。当我运行我的批处理文件时,出现以下错误:
pandoc: C:_ALL\_ALL\accomp\testing-accomp-2017.05\20170505.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 帖子:
我已经尝试过的
在上面的链接帖子中,基本上有大约四种相同答案的变体,我已经尝试了每一种变体。
最佳答案
错误是由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/原因。
关于batch-file - Pandoc Windows 批处理文件构建错误路径 openBinary 文件不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50569769/