0

我正在使用以下脚本将一个充满 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 实例中扼杀性能,但不知道这是否是我需要担心的问题。

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

4

2 回答 2

2

New-Object在你的循环之外,所以你只使用一个实例。当您将 分配New-Object给变量(对象引用)并重用它时,除非您销毁它或创建另一个对象,否则该对象将被重用。您的脚本,以其当前形式,并没有像您想象的那样为每个$docin创建一个新对象。$srcfiles

于 2013-10-16T19:25:55.950 回答
1

使用 COM 对象,您无需启动应用程序,也无需启动数十个应用程序。您正在打开库的二进制接口

您不需要或不想一遍又一遍地打开 Com 对象,因为这会导致延迟和性能下降。

不过,您应该在脚本末尾关闭 Com-Object ($word.Quit())。

于 2013-10-16T19:25:04.633 回答