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を使用している可能性があるということです-それが物事にどのように影響するかは実際にはわかりませんが。
何が足りないのですか?
問題は、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つ以上を試してください。
*パスをチェックして、正しく入力されていることを確認します。
*ファイルとフォルダのリストからファイルを選択してください。」
実際のファイル名は入力ファイル名と同じであるため無効にすることはできなかったため、これによりパスを確認することができました。