我使用以下脚本将一个充满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作为应用程序打开的语法是什么,而不是根据文件关联打开一系列启动应用程序的文档(是我担心它现在正在做什么?)
答案 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())。