【问题标题】:Powershell - SaveAs function when file already existsPowershell - 文件已存在时的另存为功能
【发布时间】:2012-04-25 14:07:43
【问题描述】:

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

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

使用“2”参数调用“SaveAs”的异常:“命令失败” 在 C:\convert\convertword.ps1:12 char:13 + $doc.saveas

当我删除之前创建的 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()

【问题讨论】:

  • 为什么不只是 Test-Path 文件然后 Remove-Item 在你尝试保存它之前,如果它存在?

标签: powershell save-as


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这个:

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

    没有报错,但是我用的是Word2010我不能用其他版本测试

    【讨论】:

    • 抱歉延迟回复我已经离开了。尝试了 application.displayalerts 但得到以下结果 术语“application.displayalerts”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。
    • 对不起,我的粘贴和复制不好!立即尝试!
    • Sorry no 它已将错误更改回原始异常调用“SaveAs”与“2”参数:“命令失败”在 C:\convert\convertword.ps1:13 char:13 + $doc.saveas
    • @SuperSub 尝试在参数中使用 [ref],就像在我的注释代码中一样,我的 box windows 7 和 office2010 可以工作!
    • 参数:“1”不应该是 System.Management.Automation.PSReference。不要使用 [ref] 。
    【解决方案3】:

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

    Remove-Item -Path $path -Force -ErrorAction SilentlyContinue
    $doc.saveas ($path, $wdFormatPDF) 
    

    【讨论】:

    • 添加了 RemoveItem 代码行,现在在表达式或语句中有不同的 errorUnexpected token '('。在 C:\convert\convertword.ps1:13 char:15 + $doc.saveas (
    • 我不知道你的实际代码是不是这样,但你发布的内容在 SaveAs 的末尾和 () 之间有一个空格。
    • Word 2010 的文档说默认情况下 SaveAs 应该覆盖现有文件 - "If a document with the specified file name already exists, the document is overwritten without the user being prompted first." 去图。
    • 啊,是的,EBGreen 很好看!尽管如此,我已经删除了额外的空间,现在又回到了与原来相同的错误。
    • 是的,Keith Hill 这就是我对 SaveAs 的理解——除非我只在文件已经存在时出现错误这一事实在这种情况下是红鲱鱼?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多