#batch-file
#пакетный файл
Вопрос:
Я унаследовал набор пакетных файлов. Bat1 вызвал bat2, который вызвал bat3. Bat3 создал xml, который bat2 использовал для создания html, а bat1 использовал его для создания pdf. Наконец, bat1 скопировал PDF-файл в выходной каталог.
Недавно я объединил три пакетных файла в один, и все работает точно так же, вплоть до окончательной команды копирования, которая завершается ошибкой, указывая, что pdf не может быть найден.
@echo off
pushd %~dp0
set sourceFile=%1
set xslt=%2
set outputFile=%3
for %%i in (%sourceFile%) do (
set documentName=%%~ni
)
::BATCH FILE 2 CALLED
::BATCH FILE 3 CALLED
echo Processing source file compose
java -cp libsaxon9.jar; net.sf.saxon.Transform -s:%sourceFile% -xsl:conversioncompose.xsl -o:compose.xml
echo Processing source file catalog
java -cp libsaxon9.jar; -s:compose.xml -xsl:conversioncatalog.xsl -o:catalog.xml
::END OF BATCH FILE 3
echo Processing source file to HTML
java -cp libsaxon9.jar; net.sf.saxon.Transform -s:catalog.xml -xsl:conversionhtml5.xsl -o:index.html
echo Bundling publication
mkdir %documentName%
xcopy /y "conversionwebapp*" %documentName% /o /x /e /h /k
move index.html %documentName%
copy source graphics into web application img res dir
for %%f in ("*.jpg" "*.png" "*.gif" "*.svg" "*.psd" "*.ai" "*.pdf") do copy "%%f" %documentName%assetimg
::END OF BATCH FILE 2
echo Running AHF
AHFCmd -extlevel 4 -d %documentName%index.html -o %documentName%.pdf -f HTML -x 4 -i toolAHFAHFSettings(x64).xml -stdout
::EVERYTHING WORKS FINE TO HERE; %documentName%.pdf is created just as it was previously.
echo Moving %documentName%.pdf
copy %documentName%.pdf %outputFile% ::Error - The system cannot find the file specified.
popd
Строка copy %documentName%.pdf %outputFile%
не изменилась. Я пытался использовать CALL перед командами AHFCmd и JAVA, но это не имеет никакого значения. Я попробовал dir /b /a-d
непосредственно перед командой копирования, и в ней указан файл, который я хочу переместить в текущий каталог. Что я делаю не так?
Комментарии:
1. Запустите
echo %documentName%.pdf %outputFile%
прямо перед командой копирования, чтобы убедиться, что не только%outputFile%
установлено, но%documentName%
и не%outputFile%
содержит пробелов. Если это произойдет, вам придется использовать двойные кавычки.2. @SomethingDark, это сработало… Я пробовал
echo %documentName%.pdf %outputFile%
раньше, и в любом или нет пробелов%outputFile%
%documentName%
, поэтому не пробовал двойные кавычки. Но помещение двойных кавычек%outputFile%
(даже если в имени файла нет пробелов) устранило проблему. Есть идеи, почему?3. Похоже, есть и другие специальные символы, такие как
,
,;
,=
или)
,amp;
,^
,…4. Откройте командную строку , запустите
cmd /?
и внимательно прочитайте выводимую справку от начала первой до конца последней страницы. На последней странице с последним абзацем объясняется, что имя файла (или папки) (или любая другая строка аргумента), содержащее пробел или один из этих символовamp;()[]{}^=;!' ,`~
(а также операторы перенаправления<|>
для интерпретации как буквальные символы в строке аргумента), должны быть заключены в двойные кавычки. Ну,[
и]
больше не имеет особого значения.5. @aschipfl, @Mofi, спасибо! В
выходных именах файлов используется разделитель, который вызывает проблемы. Я не понимал, что это специальный символ в пакетных файлах.