Powershell如何访问Word和Word对象?

时间:2013-10-16 17:02:15

标签: powershell file-io ms-word

我使用以下脚本将一个充满txt和rtf文档的目录传送到Word文档。

$global:word = new-object -comobject word.application 
$word.Visible = $False 
$srcfiles = \\Path\to\files
$savepath = \\Path\to\docfiles
$saveFormatDoc = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveFormat], 0); 

function saveas-document ($docs) {             
    "Opening $($docs.FullName)"
    $opendoc = $word.documents.open($docs.FullName)

    $savepath = "$docPath$($docs.BaseName)"
    "Converting to $savepath.doc"    
    $opendoc.saveas([ref]"$savepath", [ref]$saveFormatDoc)
}

ForEach ($doc in $srcfiles) { 
saveas-document -docs $doc
}

按照现在编码的方式,我认为它正在打开Word的新实例,在Word中打开rtf / txt文档,保存为Word文档并重复。我不会放弃Word(除非在那里有一个隐含的$word.quit()。我担心我会使用多个Word实例来杀死性能,但不知道这是否是我需要关注的问题。< / p>

这是一种更有效的编码方式,用于打开单个Word实例进行文档处理,以及将Word作为应用程序打开的语法是什么,而不是根据文件关联打开一系列启动应用程序的文档(是我担心它现在正在做什么?)

2 个答案:

答案 0 :(得分:2)

您的New-Object不在您的循环中,所以您只使用一个实例。当您将New-Object分配给变量(对象引用)并重用它时,除非您销毁它或创建另一个对象,否则将重用该对象。您的脚本(当前表单)并未为$doc$srcfiles中的每个{{1}}创建新对象。

答案 1 :(得分:1)

使用COM对象,您不会启动该应用程序,也不会启动其中的几十个应用程序。 You are opening a binary interface to libraries

您不需要或者想要反复打开Com对象,因为这会导致延迟和性能损失。

你应该在脚本的末尾关闭Com-Object($ word.Quit())。