4

PowerShell 5.0 でジョブを使用すると、奇妙な動作に気付きました。を返すジョブを実行するとPSObject、ハッシュテーブルも返されます。文字列、整数などを返すジョブは適切に機能します。

ランニング

Start-Job { New-Object PSObject -Property @{ A = 1 } } |
  Receive-Job -Wait -AutoRemoveJob

戻り値

答え: 1
RunspaceId : 6921e85f-301e-4e95-8e4b-c0882fc2085f
PSSourceJobInstanceId : 2992ef77-5642-4eac-8617-f26449a87801

ランニング

Start-Job { New-Object PSObject } | Receive-Job -Wait -AutoRemoveJob

戻り値

@{PSComputerName=localhost; RunspaceId=3e783d5f-254a-4951-bb4a-7ff6fa2812c5; PSShowComputerName=False; PSSourceJobInstanceId=1d951dec-0823-4cde-8219-4a6263550441}

ただし、実行中

Start-Job { ,@(New-Object PSObject -Property @{ A = 1 }) } |
  Receive-Job -Wait -AutoRemoveJob

戻り値

あ
-
1

Receive-JobコマンドレットがそのハッシュテーブルをPSObjectsだけに追加するのはなぜですか?

更新: PowerShell 4.0 と同じです。

4

2 に答える 2

3

PowerShell は WYSIWYG シェルではありません。通常、「得られるもの」はテキストではなく、プロパティとメソッドを持つオブジェクトです。そして、「あなたが見るもの」はそれらのテキスト表現です。多くの場合、既定では、PowerShell はオブジェクトのすべてのプロパティを表示するわけではなく、フォーマット ファイルで定義されている最も一般的なプロパティのみを表示します。また、一部のオブジェクトはカスタム フォーマットを使用します。たとえば、文字列と整数はその値のみを表示し、そのプロパティは表示しません。また、コレクションはコンテンツを表示しますが、コレクション自体は表示しません。

したがって、実際には、PowerShell はジョブから受け取ったすべてのオブジェクトに追加のプロパティを追加します。ただし、このプロパティは常に表示されるとは限りません。ジョブの出力をGet-Memberコマンドレットに渡すことで、追加のプロパティを確認できます。

Start-Job { 1,'',@() } | Receive-Job -Wait -AutoRemoveJob | Get-Member

または、プリミティブ型の書式設定を強制し、コレクションを列挙しない適切なオプションを使用してコマンドレットを書式設定します。

Start-Job { 1,'',@() } | Receive-Job -Wait -AutoRemoveJob | Format-List -Force -Expand CoreOnly
于 2016-10-25T18:54:16.727 に答える