2013-10-16 58 views
0

我正在使用以下腳本將充滿txt和rtf文檔的目錄傳送到Word文檔。Powershell如何訪問Word和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作爲應用程序打開的語法是什麼,而不是打開一系列基於文件關聯啓動應用程序的文檔(這是我害怕的現在在做)?

+0

定義了哪裏是$ word?我在代碼片段中看不到實例。 – Eris

+0

@Eris Ooops。只是扔在.... – dwwilson66

+1

我相信Colyn1337是正確的,但我也懷疑你應該保存每個文件後關閉它 – 2013-10-16 19:59:09

回答

1

與COM對象,你是不是啓動應用程序,或數十人。You are opening a binary interface to libraries

你不需要或想要反覆打開Com對象,因爲這會導致延遲和性能下降。

儘管您應該關閉腳本末尾的Com對象($ word.Quit())。

2

您的New-Object不在您的循環中,因此您只使用一個實例。當您將New-Object分配給一個變量(對象引用)並重新使用它時,除非您銷燬它或創建另一個對象,否則該對象將被重用。正如您所想的那樣,您的腳本以當前的形式不會爲中的每個$doc創建新對象。