0

私は 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 で繰り返されます。誰かが私を正しい方向に向けることができますか? 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 に答える