У меня есть следующий сценарий 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, чем раньше, хотя на самом деле я не понимаю, как это повлияет на ситуацию.
Что мне не хватает?