3

MSDNでs のクールなプロパティとメソッドについて聞いたときPSObject、それらを試してみるのはクールだろうと思いました。

それが私がやったことです:

まず、型の新しいインスタンスを作成しましたPSObject

次に、 Get-Memberを使用してこれらすべてのクールなメンバーを探しました(しかし、それらは存在しませんでした)。

PS .> $plainObj = New-Object PSObject

PS .> $plainObj | Get-Member


   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType Definition
----        ---------- ----------
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
ToString    Method     string ToString()

問題:

BaseObjectプロパティもメソッドもありませんAsPSObject()。かっこいいメンバーが全員いない。しかし、なぜ?

Get-Member は、オブジェクトの種類がではなく( TypeName) であることを教えてくれます。そして、これらすべてのクールなメンバーがいるわけではありません。PSCustomObjectPSObjectPSCustomObject

しかし、私は一種になりたいのではなく$plainObj、一種PSCustomObjectになりたいのですPSObject

私の質問:

  • atとして明示的に使用したのに、なぜ$plainObja のようなものなのですか? 何か案が?PSCustomObjectPSObject-TypeName$plainObj New-Object PSObject

  • どうすれば一種ではなく$plainObj一種になることができますか?PSObjectPSCustomObject


@RussCあなたのスクリプトを使用しても-それが結果です:

PS .> $plainObj = New-Object PSObject -property @{ title = 'fridojet' };
$plainObj | Add-Member -MemberType NoteProperty -Name Colour -Value Blue

PS .> $plainobj | Get-Member


   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Colour      NoteProperty System.String Colour=Blue
title       NoteProperty System.String title=fridojet

@RussC今、私は一種ではないオブジェクトを作成することができましたPSCustomObject:

PS .> New-Object Object

しかし、それでも、PSObject(BaseObjectプロパティなどを使用して)を作成することはできません。

PS .> [PSObject]::AsPSObject((New-Object Object)) | Get-Member


   TypeName: System.Object

Name        MemberType Definition
----        ---------- ----------
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
ToString    Method     string ToString()
4

1 に答える 1

2

何もラップしていないので、報告するものは何もないと思います。

別のオブジェクトをラップせずに、または既定のメンバーを提供せずに新しいPSObjectを作成すると、 PSCustomObjectが作成されます。

PSCustomObject について MSDN が述べているように、「パラメーターを持たない PSObject コンストラクターが使用されるときに使用されるプレースホルダー オブジェクトとして機能します。」

たとえば、これを行う場合:

$plainObj = New-Object PSObject -property @{ title = 'fridojet' }
$plainObj | Add-Member -MemberType NoteProperty -Name Colour -Value Blue

$plainObj は PSObject である必要があります。

PSObject は静的キャスト呼び出しであるため、

$date = Get-Date
$pso = PSObject.AsPSObject($date)

また

$obj = New-Object object -property @{ title = "fridojet" }
$pso = PSObject.AsPSObject($obj)

一方、BaseObject は PSObject のベースクラスを返します。

上記の 2 番目の例を使用すると、次のようになります。

$obj = New-Object object -property @{ title = "fridojet" }
$pso = PSObject.AsPSObject($obj)
$end = $pso.BaseObject

この場合、$end はオブジェクトでなければなりません。PSObject ではありません。Get-Date を使用する場合、$end は DateTime 型である必要があります。

このメソッドを使用すると、実際には PSCustomObject ではなく、PSObject の型が返されることを期待しています。

ただし、これらのプロパティとメソッドの利点はとにかく疑わしいです。PSObject ラッパーを使用する主な理由は、多くの .NET クラスでオブジェクトを渡す場合です。

実験的にやっているだけなら、まだ知らないことは何も得られません。

このブログ投稿では、特に .NET クラスを介して多数のオブジェクトを反復処理するシナリオで、PSObject を使用する理由をいくつか示しています。カスタム オブジェクトの落とし穴

于 2012-06-07T23:35:09.097 に答える