0

我刚刚开始接触 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的每个实例重复。有人可以指出我正确的方向吗? addresssubaddressTextToDisplay" appearing in the

4

1 回答 1

0

尝试创建单个对象,而不是使用单独的变量。假设 $docs 包含您要处理的所有文档对象的数组,请尝试以下操作:

$results = $docs | % {
   $docName = $_.FullName
   $_.Hyperlinks | % {
      New-Object -TypeName PSObject @Property @{
         DocName = $docName;
         Address = $_.address;
         SubAddress = $_.SubAddress;
         TextToDisplay = $_.TextToDisplay
      }
   }
}

$results | ConvertTo-Csv -NoTypeInformation -Delimiter ";" | Out-File $ofl

我现在使用的系统上没有安装 Word,因此代码可能需要一些调整才能获得正确的属性名称。

于 2013-10-29T14:32:17.380 回答