- 締切済み
Get-ChildItem出力からFullName
PowerShellのコマンドレットGet-ChildItemのパイプライン出力からファイルのFullNameを取得したいと考えています。 高校の情報の授業でタイピングの課題をしています。以前に生徒のWord文書から1文字1行のテキストファイルを作り、同様に作った正解テキストファイルをCompare-Objectに渡して、文字数を評価していました。文字数を評価するのにdiffツールを調べていたとき、初めてPowerShellを知り、「凄いものがあるんだなあ」と感心していました。PowerShellを利用したのはその時だけでした。 今回、Wordの文書からテキストファイルを作る関数をパイプラインを通して入力できるように変更したいと試行錯誤しています。Get-ChildItemからの情報には「ディレクトリ:フルパス」と「Name」があるので、FullNameを簡単に取得できそうなのに上手くいきません。 WindowsPowerShellクックブックに載っていたサンプル ◆ Get-ChildItem –Recurse | Where=Object { $_.FullName –math ‘temp’ } ではWhere-Object が $_.FullNameでFullNameを取り込んいるように思えるのですが・・・ パイプラインの出力と入力でやり取りされる情報の型、パロメータのバインディングなど全く分かっていませんが、どなたか教えていただけないでしょうか。 いま辛うじて動いている関数のスクリプトを載せておきます。 function ConvertTo-Txt1Char1LineFromDocx { [CmdletBinding()] param( [parameter(ValueFromPipeline=$true,Mandatory=$true)][ValidateNotNull()] [string]$WordDocName ) begin { #Word起動 $word = New-Object -ComObject word.application $word.visible = $false } process { ### 引数はファイル名、カレントディレクトリを確認 #### $WordDocFullName=Join-Path $PWD $WordDocName # (※1) try{ $TargetDoc = $word.Documents.Open($WordDocFullName) } catch [Exception] { Write-Host "Word文書" $WordDocName "を開くことができません" } finally{ } $ConvertedTxt = foreach($char in $TargetDoc.Characters) { $char.text } $TargetDoc.close() $OutTxtName=$WordDocFullName.replace("docx","txt") Out-File -FilePath $OutTxtName -InputObject $ConvertedTxt -Encoding default Write-Output $OutTxtName } end { # Stop-Process -Name WINWORD #または $word.quit() } } 生徒のファイルがすべて入ったフォルダをカレントディレクトリにして、次を実行。 ◆ Get-ChildItem -Recurse -File -Name | ConvertTo-Txt1Char1LineFromDocx 一応、目的は達成できるのですが、(※1)の部分とスイッチ「-Name」を使わない方法はないでしょうか。例えば、出力データそのもの(Object?)に対し、OutObject.FullNameのような表現でFullNameを取得できればいいのですが。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
お礼
ktedsさん、早速のご回答ありがとうございます。補足コメントにも書かせてもらいましたように、私が求めていたものと少し違うような気がします。 質問の趣旨が分かりやすいものになるよう今後努力していきたいと思います。ありがとうございました。
補足
Where-Object(※説明文は「-」が「=」に間違っていました)を使う気は全くないのですが、誤解を与えてみたいで申し訳ありません。 説明にも書かせていただきましたように、Get-Childitemからの出力をパイプラインから受け取る関数を作りたいと思っています。パイプラインを通しての出力はある種のObjectになっていると思うですがそれのPropertyにFullNameがあるのではないかということでWhere-Objectコマンドレットの例を書かせてもらいました。 PS>Get-ChildItem |Get-Member を実行すると TypeName:System.IO.DirectoryInfo と TypeName:System.IO.FileInfo の中に「FullName」Propertyが見つかります。 作業対象はファイルなので System.IO.FileInfoのTypeで受け取れば、出力アイテム.FullName のようなシンプルな記述で参照できるような気がします。そうすればそれをそのままワードに渡せるのですっきりしたスクリプトになるのですが、その方法が見つかりません。関数については2年前に数十行程度のものを10個ぐらい書いたほどの知識しかありませんので、トンチンカンな説明になっていれば お許しください。