从Powershell中读取缺少的Word模板

时间:2012-06-22 15:23:08

标签: powershell ms-word com-interop office-interop

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

如果模板在打开时不可用,Word将使用Normal.dot(x)替换附加的模板。但是,我正在尝试查找的模板位于文档的Tempaltes对话框中。 AttachedTempalte()和get_AttachedTemplate()。当我知道有问题的文档在单词的“模板”对话框中列出了不同的模板时,名称返回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似乎没有帮助。我还注意到interop和VBA不使用相同的wdDialog。 PS使用wdDialogToolsTemplates和VBA使用wdDialogsToolsTemplates。我用以下

检查了PS中的组件
[Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Interop.Word") | out-null
[Enum]::GetNames("Microsoft.Office.Interop.Word.WdDialogs")

并确认正确的选项是wdDialogToolsTemplates。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

<强>的PowerShell

我在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显示包含原始(不可用)模板路径的对话框,但我无法找到以编程方式提取该信息的任何方法。根据{{​​3}},两个对话框都应具有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