2013-01-04 84 views
0

我正在開發一個項目,我需要將幾千個文檔從HTML轉換爲Word。我使用此功能工作:如何在Powershell中強制執行文件操作?

function saveas-document ($docs) {   
     $opendoc = $word.documents.open($docs);  
     $savepath = $docs -replace [regex]::escape($htmPath),"$docpath" 
     $opendoc.saveas([ref]"$savepath", [ref]$saveFormat);   
     $opendoc.close(); 
} 

近日,在測試時,我的工作停滯不前,因爲文件之一是「另一用戶」鎖定。我收到一個對話框詢問我是否需要閱讀ony副本,如果稍後要編輯和合並更改,或者等待文檔再次可用的通知。另外,在我選擇打開文件的任何情況下,似乎都會覆蓋我的$word.Visible-$False參數。

我一直沒有成功識別這個鎖定我的文檔的「另一個用戶」。所有文件都在本地,非共享驅動器上,所以我不確定它們是否被鎖定。根據文件所在的位置,我確信沒有什麼需要編輯的,我可以強制文件打開,然後Save As...

我可以使用-force作爲此函數中的參數嗎?放置該參數的最佳位置在哪裏?

編輯:根據下面的JPBlanc,我試着停止Word,每個記錄有三個錯誤。

Method invocation failed because [Microsoft.Office.Interop.Word.DocumentClass] doesn't contain a method named 'quit'. 
At C:\users\x46332\desktop\sad003.ps1:69 char:18 
+  $opendoc.quit <<<<() 
    + CategoryInfo   : InvalidOperation: (quit:String) [], RuntimeException 
    + FullyQualifiedErrorId : MethodNotFound 

Exception calling "SaveAs" with "16" argument(s): "COM object that has been separated from its underlying RCW cannot be 
used." 
At C:\users\x46332\desktop\sad003.ps1:73 char:20 
+  $opendoc.saveas <<<< ([ref]"$savepath", [ref]$saveFormat); 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodException 

Exception calling "Close" with "3" argument(s): "COM object that has been separated from its underlying RCW cannot be u 
sed." 
At C:\users\x46332\desktop\sad003.ps1:74 char:19 
+  $opendoc.close <<<<(); 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodException 

回答

1

我只是覺得你是「另一個用戶」,這只是因爲$ opendoc.close();不足以釋放對該文件的訪問權限。

你可以嘗試添加:

# Stop Winword Process 
$opendoc.quit() 
$rc = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($opendoc) 

假設您正在使用打開Word文檔:

$opendoc = new-object -com "word.application" 
+0

沒有工作... :(見我的編輯以上.... – dwwilson66

+0

對不起,對我的作品在生產 – JPBlanc

+0

廢話OK,我會繼續挖掘。。不管怎麼說,還是要謝謝你。 – dwwilson66

相關問題