我刚刚开始接触 Word 对象模型的表面,并且一直在研究 MSDN,其中包含丰富的 VB 和 C# 示例。不幸的是,我正在使用 Powershell 2.0,但没有找到可以帮助我了解如何获取所需数据的好例子。另外,请原谅我使用的一些术语……它可能不准确;如果我使用了不正确的术语,请让我知道正确的术语,以便我可以在以后的问题中提高清晰度。考虑这个脚本:
$global:word = new-object -ComObject Word.Application
$word.Visible = $False
$testfile = "\\path\to\file\foo.doc"
$doc = $word.Documents.Open($testfile)
$hyperlinks = @($doc2.Hyperlinks)
$hyperlinks # console output
$word.Quit()
$doc
有很多,因为缺乏更好的术语,元数据......我可以通过等分配给变量的东西$foo1 = $doc.Fullname
。$foo2 = $doc.HasPassword
还有包含额外信息列表的元数据字段 - 我相信这些是运行时可调用包装器(RCW) - - 其值为System.__ComObject
。上面的代码提取链接列表对象,将其分配给一个名为 的数组$hyperlinks
,当打印到控制台时,会产生一系列这样的记录,每条记录代表 中的一个超链接foo.doc
。
Application : Microsoft.Office.Interop.Word.ApplicationClass
Creator : 1297307460
Parent : Microsoft.Office.Interop.Word.DocumentClass
Name : javascript:TextPopup(this)
AddressOld : javascript:TextPopup(this)
Type : 0
Range : System.__ComObject
Shape :
SubAddressOld :
ExtraInfoRequired : False
Address : javascript:TextPopup(this)
SubAddress :
EmailSubject :
ScreenTip :
TextToDisplay : IVR-generated calls
Target :
这是我遇到一些问题的地方。首先,我似乎无法访问其他 RCW 中的任何 RCW 作为变量。我可以转储数据,但不能将其分配给特定变量。例如,我无法生成任何代表记录Range
内部详细内容的控制台输出Hyperlink
。我试过了
$ranges = @($hyperlinks.Range) # no output displays
$ranges = @($doc.hyperlinks.Range) # no output displays
$ranges = @($doc.Range) # yields the following
MemberType : Method
OverloadDefinitions : {Microsoft.Office.Interop.Word.Range Range(System.Object&, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Start, System.Object&, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyTo
ken=b77a5c561934e089 End)}
TypeNameOfValue : System.Management.Automation.PSMethod
Value : Microsoft.Office.Interop.Word.Range Range(System.Object&, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Start, System.Object&, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyTok
en=b77a5c561934e089 End)
Name : Range
IsInstance : True
System.__ComObject
我可以通过使用foreach
这样的填充数组来输出 a 中单个值的列表。
$hyperlinks | %{ $_.address }
$hyperlinks | %{ $_.SubAddress }
$hyperlinks | %{ $_.TextToDisplay }
我的问题在于将这些值分配给变量。在宏伟的计划中,我正在尝试生成一个报告,该报告将输出一个包含
$doc.FullName; $doc.Hyperlinks.Address; $doc.Hyperlinks.SubAddress; $doc.Hyperlinks.TextToDisplay;
并且无法将$hyperlinks
数组中的值分配给特定字段。我想做这样的伪代码:
$o01 = $doc.FullName
$o02 = $hyperlinks | %{ $_.address }
$o03 = $hyperlinks | %{ $_.SubAddress }
$o04 = $hyperlinks | %{ $_.TextToDisplay }
$out = $o01 + ";" + $o02 + ";" + $o03 + ";" + $o4
$ofl = "outPutFile.csv"
$out | Out-File $ofl -append
生成
foo1.doc;foo2.html;;"Foo"
foo1.doc;foo3.html;foo2.html;"Foo again"
foo1.doc;foo4.html;foo3.html;"More Foo"
foo2.doc;foo5.html;foo1.html;"Foo"
foo2.doc;foo6.html;foo2.html;"Foo again"
foo3.doc;foo7.html;"More Foo"
where在第 1 列中针对与该文档关联的和$hyperlinks` 数组$doc
的每个实例重复。有人可以指出我正确的方向吗? address
subaddress
TextToDisplay" appearing in the