我刚刚开始使用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
中输出单个值的列表,以填充数组。
$hyperlinks | %{ $_.address }
$hyperlinks | %{ $_.SubAddress }
$hyperlinks | %{ $_.TextToDisplay }
我的问题在于将这些值分配给变量。在宏计划中,我正在尝试生成一个报告,该报告将输出包含
的CSV文件$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"
其中$doc
在第1列中针对与该文档关联的address
,subaddress
和TextToDisplay" appearing in the
$ hyperlinks`数组的每个实例重复。有人能指出我正确的方向吗?
答案 0 :(得分: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,因此代码可能需要进行一些调整才能获得正确的属性名称。