質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

3回答

2878閲覧

Powershell の CustomObject のプロパティの表示形式

sugarrabbit

総合スコア16

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2019/02/23 07:14

編集2019/02/23 14:36

前提・実現したいこと

Powershell にて CustomObject を作成し、Add-Member にてプロパティ追加した際の値にも CustomProperty を指定します。
その際に、その Object のプロパティを表示しますと、@{<プロパティ>=<値>} というように表示されます。
プロパティ内のCustomObject の特定のプロパティの値のみを表示したいのですが、どのようにすればよいでしょうか。

表示したい形式は、例えば Get-Process を実行した際の Threads のような形式です。(Threads 内の個々の Object の "ID" のみが表示されている)

発生している問題・エラーメッセージ

以下のように表示されます。

Powershell

1$ChildOBJ = New-Object PSCustomObject 2$ChildOBJ | Add-Member -NotePropertyName "TestName1" -NotePropertyValue "TestStr1" 3$ChildOBJ | Add-Member -NotePropertyName "TestName2" -NotePropertyValue "TestStr2" 4 5$CusOBJ = New-Object PSCustomObject 6$CusOBJ | Add-Member -NotePropertyName "ChildOBJ" -NotePropertyValue $ChildOBJ 7 8$CusObj | fl 9ChildOBJ : @{TestName1=TestStr1; TestName2=TestStr2} 10

試したこと

Get-Process の Threads は以下のように ID 属性のみが表示されます。

Powershell

1Get-Process | select -First 1 | fl Threads 2 3Threads : {2924, 3312, 3356, 3360...}

補足情報(FW/ツールのバージョンなど)

Powershell Ver 5.0 です

追記

最終目的の例としては例えば以下のように配列などでオブジェクトを構成した場合

powershell

1$ChildOBJ1 = New-Object PSCustomObject 2$ChildOBJ1 | Add-Member -NotePropertyName "Name" -NotePropertyValue "佐藤" 3$ChildOBJ1 | Add-Member -NotePropertyName "Location" -NotePropertyValue "TOKYO" 4 5$ChildOBJ2 = New-Object PSCustomObject 6$ChildOBJ2 | Add-Member -NotePropertyName "Name" -NotePropertyValue "鈴木" 7$ChildOBJ2 | Add-Member -NotePropertyName "Location" -NotePropertyValue "OSAKA" 8 9$Array = New-Object System.Collections.Arraylist 10$Array.add($ChildOBJ1) 11$Array.add($ChildOBJ2) 12 13$CustomOBJ = New-Object PSCustomObject 14$CustomOBJ | Add-Member -NotePropertyName "Person" -NotePropertyValue $Array 15$CustomOBJ | Add-Member -NotePropertyName "Group" -NotePropertyValue "本社" 16

以下のように表示されてほしいです

powershell

1$CustomOBJ | FL 2 3Person : {佐藤, 鈴木} 4Group : 本社

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

解決しました。
どうやらオブジェクトのプロパティに表示される値は、Tostring メソッドの返り値だったようです。
よって、質問の例の場合は以下のように Tostring メソッドを上書きしてやることで機体の動作となりました。

$ChildOBJ1 | Add-Member -MemberType ScriptMethod -Name "Tostring" -Value { param() ; $This.Name} -Force

投稿2019/02/23 18:11

sugarrabbit

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ChildOBJの各プロパティ(の内容)を、Threadsプロパティのような要素数の変動するリストのように表示したいというのは変だと思いつつ、きっと表示方法のイメージとして挙げたのであろうと言うことで。

ChildOBJプロパティは、TestStr1TestStr2を持つので、単純にChildOBJプロパティにアクセスしたら、そのような表示になるのは当然のことです。
その上で、オブジェクトの構成は変更せずに、プロパティの全NotePropertyの値を得るプロパティを作るならこんな感じでしょうか。hogehogeプロパティとして(ほぼ)期待される形で得られるかと思います。

PowerShell

1$ChildOBJ = New-Object PSCustomObject 2$ChildOBJ | Add-Member -NotePropertyName "TestName1" -NotePropertyValue "TestStr1" 3$ChildOBJ | Add-Member -NotePropertyName "TestName2" -NotePropertyValue "TestStr2" 4 5$CusOBJ = New-Object PSCustomObject 6$CusOBJ | Add-Member -NotePropertyName "ChildOBJ" -NotePropertyValue $ChildOBJ 7$CusOBJ | Add-Member -MemberType ScriptProperty hogehoge -value { $this.ChildObj | gm -MemberType NoteProperty |% {$this.ChildObj.($_.name) }} 8 9$CusOBJ |fl hogehoge 10 11hogehoge : {TestStr1, TestStr2}

とても汚いのでコードはScpritProperty追加方法の参考程度にとどめてください。たぶんもっときれいな(エレガントな)書き方があると思います。

さて、もし要素数が変動するプロパティをイメージされているならば、プロパティをたくさん持つオブジェクトをプロパティにするのではなく、配列のようなリストのオブジェクトをプロパティにしなければなりません。
実際にどのようなカスタムオブジェクトをプロパティとしたいのかはわかりませんが、提示されたコードから、想定される結果としては文字列のリストでしかないので、配列を使うだけで良いのでこれで済みます。

PowerShell

1$ChildOBJ = @('TestStr1','TestStr2') 2$CusOBJ = New-Object PSCustomObject 3$CusOBJ | Add-Member -NotePropertyName "ChildOBJ" -NotePropertyValue $ChildOBJ 4$CusOBJ | fl 5 6ChildOBJ : {TestStr1, TestStr2} 7 8$CusOBJ.ChildOBJ += 'TestStr3' 9$CusOBJ | fl 10 11ChildOBJ : {TestStr1, TestStr2, TestStr3}

カスタムオブジェクト配列を扱うようにする回答が正しいのだろうとは思いつつ、面倒そうなので割愛させてください。単純に追加しただけでは値は表示されないと思いますので、ここでもScriptPropertyを使うことになるのかな、と思います。

投稿2019/02/23 14:05

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sugarrabbit

2019/02/23 14:26

ありがとうございます。 ちょっと今回の質問どのようにしたらいいか考えて結果こういう形になったんですが、やはりちょっとわかりづらいですね。 私のやりたいこととして、全プロパティを出したいのではなくて、特定のプロパティを出したいということになります。 親となる $CusOBJ のプロパティを見たときに、$ChildOBJ の中がどういうものであるかの触りがわかるように、特定のプロパティのみを表示させたいということになります。
sugarrabbit

2019/02/23 14:37

ただ、ScriptProperty の利用というのも参考となりました。 ありがとうございます
退会済みユーザー

退会済みユーザー

2019/02/23 14:42

対象のプロパティを決め打ちで良いのならば、ScriptPropertyの方法でそれらのプロパティ名をリストにして渡すようにすればよいかと。 { @('TestName1','TestName2') |% {$this.ChildObj.($_) }}
sugarrabbit

2019/02/23 14:52

ありがとうございます。 ScriptProperty,ないしは別の表示したい値だけを登録したプロパティを用意する、というのも一つの方法として保持しておきます。 例としてあげている Get-Process の Threads ような形での表示というのは何とか実現できないものでしょうか。
guest

0

Powershell

1$CusObj.ChildOBJ.TestName1

Powershell

1$CusObj.ChildOBJ | fl TestName1

こちらでどうでしょうか。

投稿2019/02/23 13:36

teritama

総合スコア126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sugarrabbit

2019/02/23 14:10

ありがとうございます。 ただ、今回は特定のオブジェクトの特定のプロパティの値を確認したい、というのが趣旨ではなく、$CusObj の複数のプロパティを一度に出した時でも Get-Process の例のようにプロパティ内のオブジェクトの特定の値のみが表示されようにしたいのです。 ちなみに Get-Process の Threads を展開していただくとわかりますが、Threads 内のオブジェクトには複数のプロパティが存在します。 それと同様の表示にしたいというのが今回の質問の内容です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問