PowerShellでWordの情報をCom(Component Object Model)オブジェクトで引き抜けることを覚えた筆者。WordといえばExcelとならんで過去の業務情報が蓄積された資産でもある。先輩たちが作り上げた見積書や原価計算表、各種雛形やレポートなどが歴史ある組織には残っているものだ。
フォルダ内のWord(.docx)すべての文面をPowerShellに表示
フォルダ内にまとまった倉庫としてWordが保存してある場合もある。そういう場合には前回のスニペットをカレントフォルダ内の.docxにすべて適応させる。以下のようにPowerShellコマンドで直接呼び出すことも可能だ。
Get-ChildItem *.docx | % {
wo $_.Name
}
Get-ChildItemでフォルダ内にあるWord(.docx)ファイルのすべてを取得し、パイプとループ(%)で前回、作成した関数woにファイル名を渡している。これを実行すると、フォルダ内のWordファイルのテキストをPowerShell上に表示してくれる。
PowerShellでWordからリンクを抽出するには?
ほかに、なにか引き抜けないか?と調べてみた。こちらにVBAのWordのドキュメントオブジェクトのレファレンスがあるが、そのままPowerShellで使えるスニペットはない。PowerShellコマンドレットのgm(Get-Member)はオブジェクトの情報を表示させる機能を持つ。ひとつの足掛かりとして、woコマンドに挿入してみる。
function wo
function wo {
param([string]$FileName)
$path = Join-Path $PWD $FileName
$word = New-Object -ComObject Word.Application
$doc = $word.Documents.Open($path)
$text = $doc.Content.Text
$text
$doc | gm
$doc.Close()
$word.Quit()
}
すると、以下のように表示メソッドやプロパティのメンバ情報が表示される。
たとえばリンク。Wordをアプリケーションで開いてAlt+F12で開くVBAエディタでオブジェクトブラウザ(F2)を開きHyperlinksを検索すると使えるクラスやメンバーが表示される。
さきのオブジェクトブラウザにはHyperlinksもある。複数リンクを処理するコレクションであるので、単体のHyperlinkにあるメンバのAdressを% { $_.Address }とパイプで渡して以下のように繋いでみる。
function wl
function wl {
param([string]$FileName)
$path = Join-Path $PWD $FileName
$word = New-Object -ComObject Word.Application
$doc = $word.Documents.Open($path)
$doc.Hyperlinks | % { $_.Address }
$doc.Close()
$word.Quit()
}
こうするとWordのなかのリンクをすべて抽出できる。
最初のフォルダ内のWord(.docx)にコマンドを適用するスニペットをリンク抽出のfinction wlに変えて実行してみる
Get-ChildItem *.docx | % {
wl $_.Name
}
PowerShellからはCtrl+クリックで実際にブラウザが起動するので、あるフォルダに保存・保管したWordファイルにあるリンクをチェックするような際には役立つ。多少の骨は折れるが、調べてみて試しながらカスタマイズしていくと個人ベースでは有用なスクリプトが実装できるのであった。




