如何在Powershell中强制执行文件操作?

时间:2013-01-04 14:26:47

标签: powershell syntax error-handling

我正在开发一个项目,我需要将几千个文档从HTML转换为Word。我正在使用这个功能:

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

最近,在测试时,我的工作因为其中一个文件被“另一个用户”锁定而停滞不前。我收到一个对话框询问我是否需要读取副本,如果我想稍后编辑和合并更改,或者等待文档再次可用的通知。此外,在我选择打开文件的任何一种情况下,这似乎都会覆盖我的$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

2 个答案:

答案 0 :(得分:2)

尝试将readonly变体添加到方法中,它是第二种变体,请参阅http://msdn.microsoft.com/en-us/library/office/bb216319(v=office.12).aspx

即:

$opendoc = $word.documents.open($docs,$false,$true);

答案 1 :(得分:1)

我认为你是“另一个用户”,这只是因为$ opendoc.close();不足以释放对文件的访问权。

您可以尝试添加:

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

假设您打开word文档:

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