Помилка спроби зберегти документ Word як PDF у сценарії PowerShell


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, ніж раніше - хоча я дійсно не бачу, як це вплине на речі.

Що мені не вистачає?


Ви зберігаєте новий файл або перезаписуєте існуючий файл? Або проблема залишається так чи інакше?
Dave

@Dave - збереження до нового файлу. Якщо ви подивитеся, я видаляю всі існуючі PDF-файли у вихідній папці.
ChrisF

... Цікаво, що це проблема. Так, ви вилучите його, але, цікаво, якщо ОС має замок до ручки. Ви б спробували надати їй абсолютно унікальну назву, щоб довести, що я неправильний (жорсткий код для тестування)? У мене були жахливі проблеми з видаленням файлів і збереженням над ними таким чином завдяки блокуванню Anti-Virus для сканування ...
Dave

@Dave - ну у цьому випадку файли не існували, оскільки я перетворюю новий набір доку, тому папка виводу починається як порожня.
ChrisF

Постріл в темряві тут - це Word 32 або 64 біт?
Dave

Відповіді:


1

Проблема полягала в шляху до файлу PDF.

Я вказував, що скрипт виглядає у поточній папці, передаючи "." так назва назви:

Вихідні дані \ t

коли я додав рядок:

$fullFolder = Resolve-Path -Path $folder

і потім використовували $fullFolder замість $folder SaveAs працював як вихідний файл назви:

D: Документи Керівництво користувача Вихідні дані Приклад.pdf

Я знайшов це, намагаючись SaveAs документ Word в тій же папці, що й PDF, щоб побачити, чи виникли проблеми з доступом до папки. Повернувся з помилкою:

Виключення, що викликає "SaveAs" з "2" аргументом (ами): "Це не правильне ім'я файлу.
Спробуйте виконати одну або декілька з наступних дій:
* Перевірте шлях, щоб переконатися, що його було введено правильно.
* Виберіть файл зі списку файлів і папок. "

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.