• 締切済み

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

みんなの回答

  • steed1998
  • ベストアンサー率77% (14/18)
回答No.2

Get-ChildItem -Recurse |%{$_.Fullname} か Get-ChildItem -Recurse |Select-Object FullName とすればよいかと

  • kteds
  • ベストアンサー率42% (1876/4424)
回答No.1

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

EulerKnowsNo
質問者

お礼

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

EulerKnowsNo
質問者

補足

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

関連するQ&A

  • WPS3.0でのGet-childitemの挙動

    先日、Windows power shell 3.0をインストールし、バージョン2.0で利用していたスクリプトを実行したところ以前と挙動が変わり、目的の処理ができなくなってしまいました。 具体的には、カギ括弧"[]"が含まれるパスを対象に-Recurse付きでGet-childitemを実行した場合です。 例: > Get-ChildItem -LiteralPath 'E:\Test\[15-4]' -Recurse Get-ChildItem : 指定されたワイルドカード パターンは無効です: [15-4] 発生場所 行:1 文字:1 + Get-ChildItem -LiteralPath 'E:\Test\[15-4]' -Recurse + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Get-ChildItem], WildcardPatternException + FullyQualifiedErrorId : RuntimeException,Microsoft.PowerShell.Commands.GetChildItemCommand カギ括弧がワイルドカードとしてチェックが行われ、5以上4以下が指定されているのはおかしい、と言うエラーメッセージが出ているのだと思われます。 powershell.exe -version 2を実行して、環境をWindows power shell 2.0に切り替えてから同一のスクリプトを実行するとワイルドカード扱いとならず、期待通りの動作となります。 > Get-ChildItem -LiteralPath 'E:\Test\[15-4]' -Recurse ディレクトリ: E:\Test\[15-4] Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2012/09/13 20:02 a ディレクトリ: E:\Test\[15-4]\a Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2012/09/13 19:51 aa Windows power shell 3.0環境でも、次のケースではエラーになりません。 -Recurseが無い場合: Get-ChildItem -LiteralPath 'E:\Test\[15-4]' ディレクトリ: E:\Test\[15-4] Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2012/09/13 20:02 a -Recurseは有るが、カギ括弧の中の"-"直前・直後が前<後となっている場合: Get-ChildItem -LiteralPath 'E:\Test\[15-6]' -Recurse ディレクトリ: E:\Test\[15-6] Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2012/09/13 20:03 c ディレクトリ: E:\Test\[15-6]\c Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2012/09/13 19:51 cc 行いたいことは、下位フォルダを持っている(かもしれない)数十から数百のフォルダに対して、中身(フォルダ中のフォルダ数、.docなど特定種類のファイルの存在、下階層にフォルダしかない等)を判断し、フォルダの条件ごとに適切な場所にフォルダを移動、不要なものを削除する事です。 フォルダ名は変更できず、スクリプトも既に組んでいるので大きな変更を加えずに済むと助かります。 優先順に次の事柄を教えて頂けると助かります。 1.Windows power shell 3.0で”[15-4]”のような文字列を含むフォルダの下位階層のオブジェクトを取得する方法。 2.上記が困難な場合、Windows power shell 3.0をアンインストールせずに、デフォルトの実行環境をWindows power shell 2.0環境に固定する方法。 3.Windows power shell 3.0で上手くいかない理由。(バグ?、仕様変更?、本来の仕様に修正?) よろしくお願いします。

  • ファイル名が8文字のものを削除

    powershellで get-childitem . -include ????????.jpg -recurse とすれば、ファイル名が8文字のものを抽出できると教わったのですが、これを削除したいです。どうすればいいですか? powershell について調べたら、削除する方法もあるみたいですが、難しくて、私の頭では理解できそうにありません。理解できたとしても、何日もかかりそうです。お願いします。

  • フォルダのアクセス権のみを取得する方法

    WindowsのPowerShellでフォルダのアクセス権を取得したいです。 WindowsServerの以下のコマンドでNTFSのアクセス権、サブディレクトリのNTFSのアクセス権、オーナーが誰か取得する方法は分かりました。 PS > Get-ChildItem 取得したいフォルダ\ -Recurse | Get-ACL | Format-Table -AutoSize -Wrap | Out-File フォルダ名\ファイル名.txt -Encoding Default これだとファイルのアクセス権なども取得出来てしまうのですが、ファイルのアクセス権は不要です。 ディレクトリとサブディレクトリのアクセス権とオーナーが誰かだけ取得したいのですが、方法はありますでしょうか? 宜しくお願いします。

  • powershell コマンドレッドの構文

    こんにちは。Powershellを勉強しようとしているものです。 Get-Help関数を使ってGet-ChildItemを引いたところ、構文が表示されました。 この構文の意味がわかりません、どのような意味になるかお教え頂けないでしょうか? まず[ ]は省略可能ということでしょうか? <string>はストリング型のパラメーター値を受け付けるということでしょうか? その場合、<string[]>はどういう意味になるでしょうか? どうぞ、宜しくお願いします。 >Get-Help Get-ChildItem 構文 Get-ChildItem [[-Path] <string[]>] [[-Filter] <string>] [-Exclude <string[]>] [-Force] [-Include <string[]>] [-Name] [-Recurse] [-UseTransaction] [<CommonParameters>]

  • PowerShellでフォルダのアクセス権の取得

    WindowsのPowerShellでフォルダのアクセス権を取得したいです。 以下のコマンドでNTFSのアクセス権、サブディレクトリのNTFSのアクセス権、オーナーが誰か取得する方法は分かりました。 PS > Get-ChildItem 取得したいフォルダ\ -Recurse | Get-ACL | Format-Table -AutoSize -Wrap | Out-File フォルダ名\ファイル名.txt -Encoding Default 本題ですが、NTFSのアクセス権だけでなく、フォルダの共有アクセス権も同時に取得したいのです。それは可能でしょうか? サブディレクトリの共有アクセス権も取得したいです。また、オーナーが誰かも取得したいです。 ご教示頂けますと幸いです。宜しくお願いします。

  • PowerShellについて

    PowerShellについて 以下の構文ですが、これは、Cドライブ配下のフォルダを取得し、 アクセス権を取得しCSVに吐き出す処理のようですが、このCSVは どこにはきだされるのでしょうか? ? Cドライブで実行してみましたが、何もファイルが作られていないようです。 Get-ChildItem c:\ -Recurse | Get-ACL |Export-Csv c:ACL-List.csv

  • PowerShell ファイル連結&出力方法

    PowerShellについてお教え下さい。Cドライブ直下に100のCSVファイルがあります。ヘッダーがある為、全CSVファイルの2行目以降を連結させて1ファイルを作りたいと思っています。 そこで下記のようなスクリプトを書きました。 Get-ChildItem $path | % {Get-Content $_ | Select-Object -Skip 1} > xxx.csv しかし、xxx.csvにデータは出力されるのですが、ループ状態に陥ってしまいファイル容量がどんどん増えていってしまいます。これを解決するにはどのようにしたらよいでしょうか? よろしくお願いします。

  • powershellでフォルダ情報を取得したい

    ■前提・実現したいこと powershellで、カレントフォルダ配下にある多数のフォルダに対し、 フォルダ名、最終更新日時、フォルダ内のjpgファイルの個数、フォルダ内のpngファイルの個数 をカンマ区切りのcsv形式でファイルに保存したいです。 ■試したこと 以下のコマンドで、ファイル名、最終更新日は取得することができました。 Get-ChildItem | Sort-Object Name | Select-Object Name, LastWriteTime | convertTo-csv -delimiter "`t" | Select -Skip 2 | Out-File ../out.txt -encoding Default 1つずつのフォルダに対して以下のコマンドでjpgファイルの個数が取得できるようです。 (Get-ChildItem . | Where-Object { $_.Extension -eq ".jpg" }).Count 最初のコマンドにうまく合わせることで、1コマンドで取得できるようにしたいのですが、 どうすればよいのか分からず、教えていただけないでしょうか。

  • PowerShellでTXTを1行ごと読込んで処理

    PowerShellでの処理で教えてください。 C:\list\loglist.txtというファイルに、 C:\Documents and Settings\mama\My Documents\Shell\log C:\share\LOGS C:\diaglog というように、ログフォルダまでのパスが書いてあるファイルがあり、この中身は、時々変更されます。 このテキストを1行ずつ読み込みながら、各フォルダの配下にあるサブフォルダを含めたフォルダ内に、.logというファイルがあり、そのファイルサイズが0でなければ、ファイルを別フォルダへコピーして、元のファイルは削除するということを行いたいのです。 そこで、下記のようなスクリプトを書いてみましたが、エラーとなってしまいます。 $day = Get-Date -format yyyyMMdd $LOGPATH = "C:\list\loglist.txt" $txt = Get-Content $LOGPATH $sr = New-Object System.IO.StreamReader($txt, [System.Text.Encoding]::UTF8) while (($line = $sr.ReadLine()) -ne $null) { #0じゃないログを取得 $fname = Get-ChildItem -path $ff -Recurse | Where-Object {$_.Length -gt 0} # ログをバックアップフォルダへコピーしてリネーム     ・     ・     ・     ・ この#0じゃないログを取得にまで至らず、エラーがでます。 エラーは New-Object : "2" 個の引数を指定して ".ctor" を呼び出し中に例外が発生しました: "指定されたパスのフォーマットはサポートされていません。" 発生場所 行:×× 文字:×× + $sr = New-Object <<<< System.IO.StreamReader($txt, [System.Text.Encoding]::UTF8) + CategoryInfo : InvalidOperation: (:) [New-Object]、MethodInvocationException + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand [System.Object[]] に 'ReadLine' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。 発生場所 行:×× 文字:×× + while (($line = $sr.ReadLine <<<< ()) -ne $null) + CategoryInfo : InvalidOperation: (ReadLine:String) []、RuntimeException + FullyQualifiedErrorId : MethodNotFound パスを呼び出す元になっている『C:\list\loglist.txt』は、他の担当者が作成したものですが、パスの最後に\を入れても変わりませんでした。 PowerShellISEで、$line だけを実行すると、パスはテキストの1行目のC:\Documents and Settings\mama\My Documents\Shell\logが取得できています。 コードはhttp://codezine.jp/article/detail/3592?p=2を参考に作ってみたのですが、まだまだ初心者のためどこを修正すればいいのかわからず途方にくれています。 コードの修正か、もしくは、もっと別な方法などありましたら、ご教授をお願いします。

  • Get-Aclコマンド(PowerShell)

    Get-AclコマンドでCドライブの中にあるフォルダのアクセス権を 表示させようとしていますが、なぜかうまくいきません。 手順としてCドライブのフォルダ確認 PS C:\> dir ディレクトリ: C:\ Mode LastWriteTime Length Name ---- ------------- ------ ---- da--- 2011/03/31 15:37 APSETUP d---- 2011/12/30 20:50 Fujitsu d---- 2011/03/31 15:52 Intel d---- 2009/07/14 12:20 PerfLogs d-r-- 2014/09/12 20:15 Program Files d-r-- 2014/09/12 20:15 Program Files (x86) d---- 2014/01/18 15:57 temp d---- 2011/12/30 20:26 Users d---- 2014/04/30 23:39 Windows d---- 2013/10/06 7:17 マイフォト -a--- 2012/08/31 21:40 1024 .rnd $testaclという変数を作り、get-childItemとget-aclの結果を格納する。 PS C:\> $testacl = Get-ChildItem | Get-Acl .Accessプロパティでアクセス権の詳細を表示 PS C:\> $testacl.access しかし、なにも表示されず・・・・・・ なにが悪いのでしょう?? ちなみに、testacl.accessをexport-csvを使ってCSVに出力してみたところ 何もない空のファイルでした。 エラーはなにもでていないのに・・・ どなたかご教授ねがいます。