5

У меня есть следующий сценарий PowerShell для преобразования папки файлов DOCX в PDF:

param (
    [string]$folder = '.'
)

Add-type -AssemblyName Microsoft.Office.Interop.Word

$word_app = New-Object -ComObject Word.Application
$word_app.visible = $false

Get-ChildItem -Path "$folder\Output" -Filter *.pdf | ForEach-Object {
    remove-item $_.FullName
}

Get-ChildItem -Path "$folder\Input" -Filter *.docx | ForEach-Object {
    $document = $word_app.Documents.Open($_.FullName)

    # Remove spaces in the name as we're uploading this to the web
    $filename = $_.BaseName -replace ' ',''

    $pdf_filename = "$($folder)\Output\$($filename).pdf"

    $document.SaveAs([ref] $pdf_filename, [ref] 17)

    $document.Close()
}

$word_app.Quit()

Это хорошо работало на Windows 7 (64-разрядная версия) с Office 2010 (32-разрядная версия).

С тех пор у меня была новая машина с Windows 8.1 (64-разрядная версия) и Office 2013 (32-разрядная версия), и теперь, когда я пытаюсь запустить сценарий, я получаю ошибки в строке SaveAs . Первая ошибка заключалась в том, что в аргументе [ref] аргументов не было необходимости. Поэтому я изменил эту строку на:

    $document.SaveAs($pdf_filename, 17)

Тем не менее, это теперь ошибки со следующим:

Exception calling "SaveAs" with "2" argument(s): "Command failed"
At D:\Documents\User Guides\ConvertToPDF.ps1:31 char:5
+     $document.SaveAs($pdf_filename, 17)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation

Других признаков того, что не так, нет. Выходная папка существует и доступна для записи. Я добавил код для обхода структуры ошибок и внутреннее исключение:

Сообщение: команда не выполнена
Код ошибки: 800A1066 (-2146824090)

Что, казалось бы, указывает на какой-то сбой COM.

Я также пытался

    $document.ExportAsFixedFormat($pdf_filename, 17)

но это дает мне

Exception calling "ExportAsFixedFormat" with "2" argument(s): "The directory name is not valid."
At D:\Documents\User Guides\ConvertToPDF.ps1:33 char:5
+     $document.ExportAsFixedFormat($pdf_filename, 17)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation

Несмотря на то, что имя каталога является действительным.

Я искал в Интернете, но все страницы, которые я нашел, указали, что это все, что мне нужно сделать.

Единственное, о чем я только что подумал, - это то, что я мог бы использовать более высокую версию PowerShell, чем раньше, хотя на самом деле я не понимаю, как это повлияет на ситуацию.

Что мне не хватает?

1 ответ1

1

Проблема была с путем к файлу pdf.

Я указывал, что скрипт просматривает текущую папку, передавая "." поэтому имя выхода было:

,\Output\ example.pdf

когда я добавил строку:

$fullFolder = Resolve-Path -Path $folder

а затем использовали $fullFolder вместо $folder SaveAs работал имя выходного файла стали:

D:\Documents\ Руководства пользователя \ Output \ Example.pdf

Я обнаружил это, пытаясь SaveAs документ Word в той же папке, что и файл PDF, чтобы проверить, нет ли у него проблем с доступом к папке. Это вернулось с ошибкой:

Исключение вызывает "SaveAs" с аргументом (ами)"2": «Это недопустимое имя файла.
Попробуйте выполнить одно или несколько из следующих действий:
* Проверьте путь, чтобы убедиться, что он был введен правильно.
* Выберите файл из списка файлов и папок. "

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .