2

我有一系列链接到不再存在的模板的 Word 文档。这给试图打开它们的用户带来了问题。我可以获取文档列表,遍历每个文档,并将模板设置为空。虽然这将解决问题,但在更改模板之前我无法确定模板是什么。

如果模板在打开时不可用,Word 将用 Normal.dot(x) 替换附加的模板。但是,我尝试查找的模板位于文档的“模板”对话框中。AttachedTempalte() 和 get_AttachedTemplate().Name 当我知道有问题的文档在 word 的“模板”对话框中列出了不同的模板时,都会返回 Normal.dot。

我可以在 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。

4

2 回答 2

0

在 powershell 中,您必须使用 [] 括号指定类型,然后使用 :: 指定类型成员,因此您的第 3 行 powershell 代码应如下所示:

$word.Dialogs([Microsoft.Office.Interop.Word.WdWordDialog]::wdDialogToolsTemplates).Template()

请参阅以下有关 powershell 枚举的博客文章:Jeffrey SnoverRichard Siddaway

于 2012-09-24T19:11:46.100 回答
0

我正在尝试做类似的事情,主要目的不是在 Word 文档中存储任何代码。

电源外壳

我在 PowerShell 路由方面取得了一点进展,但我找不到从对话框中提取路径的方法。

$objWord = New-Object -ComObject "Word.Application"
$objWord.Visible = $True
$objDoc = $objWord.Documents.Open("C:\path\to\document.doc")
$objToolsTemplates = $objWord.Dialogs.Item([Microsoft.Office.Interop.Word.WdWordDialog]::wdDialogToolsTemplates)
$objDocStats = $objWord.Dialogs.Item([Microsoft.Office.Interop.Word.WdWordDialog]::wdDialogDocumentStatistics)

现在$objToolsTemplates.Show()$objToolsTemplates.Show()两者都导致 GUI 显示包含原始(不可用)模板路径的对话框,但我找不到任何以编程方式提取该信息的方法。根据MSDN WdWordDialog Enumeration 文档,这两个对话框都应该有一个Template属性。

VBScript

最后我不得不改用VBS。以下代码将为您提供原始(不可用)模板的路径。至少它仍然是一个脚本。

Option Explicit

Const wdDialogToolsTemplates = 87
Const wdDoNotSaveChanges = 0

Dim objWordApp
Dim objDoc
Dim dlgTemplate

Set objWordApp = CreateObject("Word.Application")
objWordApp.Visible = False
Set objDoc = objWordApp.Documents.Open("C:\path\to\document.doc")
Set dlgTemplate = objWordApp.Dialogs(wdDialogToolsTemplates)

Wscript.Echo dlgTemplate.Template

objDoc.Close(wdDoNotSaveChanges)
objWordApp.Quit
于 2015-04-09T14:20:12.637 回答