尝试在 PowerShell 脚本中将 Word 文档保存为 PDF 时出错

尝试在 PowerShell 脚本中将 Word 文档保存为 PDF 时出错

我有以下 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()

这在装有 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

没有其他迹象表明出了什么问题。输出文件夹存在且可写。我添加了代码来遍历错误结构,内部异常是:

消息:命令失败
错误代码: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

问题出在 pdf 文件的路径上。

我通过传入“。”来指定脚本在当前文件夹中查找,因此输出名称为:

.\输出\示例.pdf

当我添加以下行时:

$fullFolder = Resolve-Path -Path $folder

然后使用它$fullFolder来代替输出文件名:$folderSaveAs

D:\Documents\用户指南\Output\Example.pdf

我尝试将SaveAsWord 文档放在与 pdf 相同的文件夹中,以查看它是否在访问该文件夹时遇到问题,从而发现了此问题。结果返回错误:

使用“2”个参数调用“SaveAs”时发生异常:“这不是有效的文件名。
请尝试以下一项或多项操作:
* 检查路径以确保输入正确。
* 从文件和文件夹列表中选择一个文件。”

这使我开始检查路径,因为实际文件名不可能无效,因为它与输入文件名相同。

相关内容