3

我正在尝试运行一些代码来查找目录和子目录中的所有 .doc 和 .docx 文件,然后将每个文件转换为 PDF 格式。

下面的代码仅在这些目录中没有 pdf 的实例时才有效,即它仅在第一次时有效。以后每次它都会失败:

使用“2”参数调用“SaveAs”的异常:“命令失败”在 C:\convert\convertword.ps1:12 char:13 + $doc.saveas <<<< ($path, $wdFormatPDF) + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ComMethodTargetInvocation

当我删除以前创建的 PDF 并重新运行 PS 时,它工作正常。因此,我只能假设我的SaveAs函数中缺少一个开关或参数,它以某种方式强制覆盖?

$wdFormatPDF = 17
$word = New-Object -ComObject word.application
$word.visible = $false
$folderpath = "c:\convert\*"
$fileTypes = "*.docx","*doc"
Get-ChildItem -path $folderpath -recurse -include $fileTypes |
foreach-object `
{
$path =  ($_.fullname).substring(0,($_.FullName).lastindexOf("."))
"Converting $path to pdf ..."
$doc = $word.documents.open($_.fullname)
$doc.saveas($path, $wdFormatPDF) 
$doc.close()
}
$word.Quit()
4

3 回答 3

2

好的,我终于认为我已经找到了问题所在。它是锁定文件的Windows 资源管理器预览窗格。我已经打开了正在创建和转换文件的目录的显示预览窗格,这一定是在 pdf 上创建了文件锁,因此脚本无法保存新的 pdf。我在我的 Windows 资源管理器中关闭了预览窗格,脚本现在可以重复运行!因此,Powershell 脚本没有任何问题,但感谢所有输入人员。这是我可以找到的关于该主题的最接近的 MS 知识库文章的链接http://support.microsoft.com/kb/942146

于 2012-05-01T09:47:24.107 回答
1

尝试这个:

$word.displayalerts = $false
$doc.saveas($path, $wdFormatPDF) # with Word2010 I've to use  $doc.saveas([ref]$path, [ref]$wdFormatPDF)
$word.displayalerts = $true

没有出现错误,但我使用的是 Word2010 我无法用其他版本测试它

于 2012-04-25T16:01:19.607 回答
0

根据SaveAsSaveAs2的文档,没有可以覆盖的标志。因此,您可以在保存之前将其删除,如下所示:

Remove-Item -Path $path -Force -ErrorAction SilentlyContinue
$doc.saveas ($path, $wdFormatPDF) 
于 2012-04-25T15:24:05.330 回答