もう存在しないテンプレートにリンクしている一連の Word 文書があります。これは、ユーザーがそれらを開こうとする際に問題を引き起こしています。ドキュメントのリストを取得し、それぞれをループして、tempalte を null に設定できます。これで問題は解決しますが、変更前のテンプレートが何であったかを判断できません。
テンプレートを開いたときに利用できない場合、Word は添付されたテンプレートを Normal.dot(x) に置き換えます。ただし、検索しようとしているテンプレートは、ドキュメントの Tempaltes ダイアログにあります。AttachedTempalte() と get_AttachedTemplate().Name の両方が Normal.dot を返すのは、問題のドキュメントに Word の [テンプレート] ダイアログに別のテンプレートがリストされていることがわかっている場合です。
これは VBA でアクセスできますが、PS でこれができないのはもどかしいです。私がどこを台無しにしているのか誰にもわかりますか?
$word = new-object -comobject "Word.Application"
$doc = $word.Documents.Open({document path})
$word.Dialogs(Microsoft.Office.Interop.Word.WdWordDialog.wdDialogToolsTemplates).Template()
戻り値:
Missing ')' in method call.
At :line:1 char:15
+ $word.Dialogs(M <<<< icrosoft.Office.Interop.Word.WdWordDialog.wdDialogToolsTemplates).Template()
作業中の VBA:
Dim doc as Word.Document
Dim strTemplate as String
Set doc = Documents.Open(Filename:=filename, Visible:=False)
doc.Activate
strTemplate = Word.Dialogs(wdDialogsToolsTemplates).Template
その後、strTemplate に表示されるはずのテンプレート名とパスを確認できます。
ps スクリプトを確認しましたが、 $doc.Activate を追加しても解決しないようです。また、相互運用機能と VBA が同じ wdDialog を使用していないことにも気付きました。PS は wdDialogToolsTemplates を使用し、VBA は wdDialogsToolsTemplates を使用します。PSでアセンブリを次のようにチェックしました
[Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Interop.Word") | out-null
[Enum]::GetNames("Microsoft.Office.Interop.Word.WdDialogs")
正しいオプションが wdDialogToolsTemplates であることを確認しました。