0

私は、数千のドキュメントを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();
}

最近、テスト中に、ドキュメントの1つが「別のユーザー」によってロックされているため、私の仕事が行き詰まりました。読み取り用のコピーが必要かどうか、後で変更を編集してマージするかどうか、またはドキュメントが再び利用可能になるという通知を待つかどうかを尋ねるダイアログボックスが表示されます。また、ファイルを開くことを選択した場合、どちらの場合も、$word.Visible-$Falseパラメーターがオーバーライドされているようです。

ドキュメントをロックしているこの「別のユーザー」を特定できませんでした。すべてのドキュメントはローカルの非共有ドライブにあるため、何がドキュメントをロックしているのかわかりません。ファイルが存在する場所に基づいて、編集する必要はないと確信しており、ファイルを強制的に開くことができます。Save As...

-forceこの関数のパラメーターとして使用できますか?そのパラメータを配置するのに最適な場所はどこですか?

編集:以下のJPBlancに従って、Wordを停止しようとしましたが、レコードごとに3つのエラーが発生しました。

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
4

2 に答える 2

2

メソッドに読み取り専用バリアントを追加してみてください。これは2番目のバリアントです。http ://msdn.microsoft.com/en-us/library/office/bb216319 (v = office.12).aspxを参照してください。

すなわち:

$opendoc = $word.documents.open($docs,$false,$true);
于 2013-01-07T18:59:48.957 に答える
1

$ opendoc.close();という理由だけで、あなたは「別のユーザー」だと思います。ファイルへのアクセスを解放するには十分ではありません。

追加してみてください:

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

あなたがあなたのワード文書を次のように開いていると仮定します:

$opendoc = new-object -com "word.application"
于 2013-01-04T15:49:01.990 に答える