代码之家  ›  专栏  ›  技术社区  ›  Eric Hepperle - CodeSlayer2010

PanDoc Windows批处理文件生成错误路径OpenBinary文件不存在

  •  3
  • Eric Hepperle - CodeSlayer2010  · 技术社区  · 7 年前

    问题

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

    我正在尝试编写一个简单的一行批处理文件,该文件将使用 pandoc 将所有Doc或Docx(MS Word)文件转换为Markdown(.md)文件。运行批处理文件时,会出现以下错误:

    pandoc:c:ou all \u all \concer \testing-concer-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 ... ,灵感来自此堆栈溢出日志:

    我已经试过了

    基本上,在上面链接的帖子中,同一个答案有四种变化,我尝试过每一种变化。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mofi    7 年前

    错误是由 delayed expansion 还有感叹号 ! 在目录名中 !accomp .

    要执行的命令行 为了 使用文件执行期间展开 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 因为没有环境变量用于 为了 命令行。

    @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/ 因为这个原因。

    推荐文章