web-dev-qa-db-ja.com

PowerShellスクリプトでWord文書をPDF)として保存しようとしてエラーが発生しました

Docxファイルのフォルダーをpdfに変換する次のPowerShellスクリプトがあります。

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()

これは、Office 2010(32ビット)を搭載したWindows 7(64ビット)で正常に機能しました。

それ以来、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

何が悪いのかを示す他の兆候はありません。出力フォルダが存在し、書き込み可能です。エラー構造をトラバースするコードを追加しました。内部例外は次のとおりです。

メッセージ:コマンドが失敗しました
ErrorCode: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を使用している可能性があるということです-それが物事にどのように影響するかは実際にはわかりませんが。

何が足りないのですか?

4
ChrisF

問題は、PDFファイルへのパスにありました。

「。」を渡すことで、スクリプトが現在のフォルダーを検索するように指定していました。したがって、出力名は次のとおりです。

。\ Output\Example.pdf

行を追加したとき:

$fullFolder = Resolve-Path -Path $folder

次に、$fullFolderの代わりに$folderを使用すると、出力ファイル名が次のようになり、SaveAsが機能しました。

D:\ Documents\User Guides\Output\Example.pdf

これは、PDFと同じフォルダーにあるWord文書をSaveAsして、フォルダーへのアクセスに問題がないかどうかを確認することで見つかりました。それはエラーで戻ってきました:

「2」引数を指定して「SaveAs」を呼び出す際の例外:「これは有効なファイル名ではありません。
次の1つ以上を試してください。
*パスをチェックして、正しく入力されていることを確認します。
*ファイルとフォルダのリストからファイルを選択してください。」

実際のファイル名は入力ファイル名と同じであるため無効にすることはできなかったため、これによりパスを確認することができました。

0
ChrisF