こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

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を取得できればいいのですが。
 よろしくお願いいたします。

投稿日時 - 2018-10-08 13:16:32

QNo.9545498

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

Get-ChildItem -Recurse |%{$_.Fullname}

Get-ChildItem -Recurse |Select-Object FullName
とすればよいかと

投稿日時 - 2018-10-19 10:59:57

ANo.1

例えば、c:\windows\system32 にある fullname に "cpl"という文字を含むファイルのfullnameを取得するには下記のようにすればいいです。
$(get-childitem c:\windows\system32 |where {$_.fullname -match "cpl"}).fullname
実行結果は添付画像参照。

投稿日時 - 2018-10-08 16:48:12

補足

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個ぐらい書いたほどの知識しかありませんので、トンチンカンな説明になっていれば お許しください。

投稿日時 - 2018-10-09 14:42:35

お礼

ktedsさん、早速のご回答ありがとうございます。補足コメントにも書かせてもらいましたように、私が求めていたものと少し違うような気がします。
質問の趣旨が分かりやすいものになるよう今後努力していきたいと思います。ありがとうございました。

投稿日時 - 2018-10-09 14:49:29

あなたにオススメの質問