私は Word オブジェクト モデルの表面をなぞり始めたばかりで、VB と C# の例が豊富な MSDN を研究しています。残念ながら、私は 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"
whereは、そのドキュメントに関連付けられた および $hyperlinks` 配列の各$doc
インスタンスの列 1 で繰り返されます。誰かが私を正しい方向に向けることができますか? address
subaddress
TextToDisplay" appearing in the