Пакетный файл Pandoc для Windows создает неверный путь. Файл openBinary не существует.

ПРОБЛЕМА

Это может быть просто связано с отсутствием глубокого понимания кодирования пакетных файлов Windows.

Я пытаюсь написать простой однострочный пакетный файл, который будет обрабатывать каждый файл в каталоге, используя pandoc для преобразования всех doc или docx (MS Word) в файлы уценки (.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 ..., вдохновленный этим постом о переполнении стека:

ЧТО Я УЖЕ ПРОБОВАЛА

По сути, в приведенном выше сообщении есть около четырех вариантов одного и того же ответа, и я пробовал каждый из этих вариантов.


person Eric Hepperle - CodeSlayer2010    schedule 28.05.2018    source источник
comment
@aschipfl Спасибо за ссылку, и я уже это знаю, поэтому, как вы заметите, я не упомянул в своем тексте CMD как DOS. Я пометил вопрос как DOS, потому что те, кто знает о DOS, скорее всего, также понимают CMD, и поэтому я не хочу исключать людей, которые могут предложить полезные ответы на основе семантики.   -  person Eric Hepperle - CodeSlayer2010    schedule 28.05.2018
comment
Я понимаю вашу точку зрения, но я не согласен, потому что командная строка DOS имеет очень ограниченные возможности по сравнению с CMD (хотя я должен признать, что у них один и тот же корень). Поэтому пометка вопроса CMD как DOS кажется мне немного неадекватной (это все равно, что задать вопрос C++ и также пометить его как C)...   -  person aschipfl    schedule 28.05.2018
comment
@aschipfl Я понимаю вашу точку зрения, и это имеет смысл с аналогией C ++ и C. Предполагая, что код, который я пытаюсь реализовать, предназначен для CMD, можете ли вы сказать мне, что с ним не так? Я думаю, что это как-то связано с расширением переменных, но каждый раз, когда я пытаюсь понять это, я просто путаюсь.   -  person Eric Hepperle - CodeSlayer2010    schedule 28.05.2018


Ответы (1)


Ошибка вызвана задержкой развертывания и восклицательным знаком ! в имени каталога !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. НЕ УДАЕТСЯ дать текст или пустую строку - Вместо этого используйте ECHO/ по причине.

person Mofi    schedule 28.05.2018
comment
Спасибо Мофи! Задержка расширения действительно была проблемой. Я удалил строку setlocal и в итоге использовал эту команду FOR /r "." %%i IN (*.doc *.docx) DO pandoc "%%~fi" -o "%%~dpni.md", которая отлично сработала. Пометил ответ как правильный. - person Eric Hepperle - CodeSlayer2010; 29.05.2018
comment
В очередной раз благодарим за помощь! Я разместил полученный файл в своем репозитории GitHub здесь: github.com/codewizard13/batch-convert-pandoc/blob/master/ - person Eric Hepperle - CodeSlayer2010; 29.05.2018