Powershellでのオブジェクトプロパティの印刷


119

インタラクティブコンソールで作業しているときに、次のように新しいオブジェクトを定義し、それにいくつかのプロパティ値を割り当てます。

$obj = New-Object System.String
$obj | Add-Member NoteProperty SomeProperty "Test"

次に、変数の名前をインタラクティブウィンドウに入力すると、Powershellによってオブジェクトのプロパティと値の概要が表示されます。

PS C:\demo> $obj
SomeProperty                                                                                                                                                                                  
------------                                                                                                                                                                                  
Test

基本的に、これを行いたいのですが、スクリプト内の関数内からです。関数はオブジェクトを作成し、いくつかのプロパティ値を設定します。戻る前に、Powershellウィンドウにオブジェクト値の概要を出力します。関数内でWrite-Hostを使用してみました:

Write-Host $obj

しかし、これは要約ではなくオブジェクトのタイプを出力するだけです:

System.Object

関数でオブジェクトのプロパティ値の概要をPowershellウィンドウに出力するにはどうすればよいですか?

回答:


186

これを試して:

Write-Host ($obj | Format-Table | Out-String)

または

Write-Host ($obj | Format-List | Out-String)

4
それを機能させるには、-Forceパラメータを渡す必要がありました。たとえば、Write-Host ($obj | Format-List -Force | Out-String)
Bart Verkoeijen

1
うわっ!それでも画面上に水平に表示されます...出力がバッファの外に出た場合は、単に出力します...。私はPOSHで愛が嫌いです
コロブキャニオン

使用する$objs = @();$objs = $objs + $obj; 、私は使用することができますConvertTo-Html$ colsの= $ OBJSを| ConvertTo-Html -Fragment -Property Name、DataType、Default、Identity、InPrimaryKey、IsForeignKey、Description;
Kiquenet

32

この問題に対する私の解決策は、$()サブ式ブロックを使用することでした

Add-Type -Language CSharp @"
public class Thing{
    public string Name;
}
"@;

$x = New-Object Thing

$x.Name = "Bill"

Write-Output "My name is $($x.Name)"
Write-Output "This won't work right: $x.Name"

与える:

My name is Bill
This won't work right: Thing.Name

16

Powershellでオブジェクトのプロパティと値を出力します。以下のは私にとってはうまくいきます。

$ pool = Get-Item "IIS:\ AppPools.NET v4.5"

$ pool | Get-Member

   TypeName: Microsoft.IIs.PowerShell.Framework.ConfigurationElement#system.applicationHost/applicationPools#add

Name                        MemberType            Definition
----                        ----------            ----------
Recycle                     CodeMethod            void Recycle()
Start                       CodeMethod            void Start()
Stop                        CodeMethod            void Stop()
applicationPoolSid          CodeProperty          Microsoft.IIs.PowerShell.Framework.CodeProperty
state                       CodeProperty          Microsoft.IIs.PowerShell.Framework.CodeProperty
ClearLocalData              Method                void ClearLocalData()
Copy                        Method                void Copy(Microsoft.IIs.PowerShell.Framework.ConfigurationElement ...
Delete                      Method                void Delete()
...

$ pool | Select-Object -Property *#-Propertyは省略できます

name                        : .NET v4.5
queueLength                 : 1000
autoStart                   : True
enable32BitAppOnWin64       : False
managedRuntimeVersion       : v4.0
managedRuntimeLoader        : webengine4.dll
enableConfigurationOverride : True
managedPipelineMode         : Integrated
CLRConfigFile               :
passAnonymousToken          : True
startMode                   : OnDemand
state                       : Started
applicationPoolSid          : S-1-5-82-271721585-897601226-2024613209-625570482-296978595
processModel                : Microsoft.IIs.PowerShell.Framework.ConfigurationElement
...

1
これの最後のバリアントは私にとって最もうまくいきました-それを$x | select *に短縮することもでき、インタラクティブに最適です。
2018年

スクリプトで記述したい場合、これは機能しないと思います。もしそうなら、私はあなたが実際にコンソールにそれを印刷するために記載されているものよりも何か追加する必要があると思います(すなわち:Write-Output <something-something>)
Fractal

11

ヒント#1

Write-Hostは使用しないでください。

ヒント#12

PowerShellコマンドレットまたは関数から情報を出力する正しい方法は、データを含むオブジェクトを作成してから、Write-Outputを使用してそのオブジェクトをパイプラインに書き込むことです。

-Don Jones:PowerShellマスター

理想的には、スクリプトがオブジェクト($obj = New-Object -TypeName psobject -Property @{'SomeProperty'='Test'})を作成し、次にWrite-Output $objects。パイプで出力しFormat-Tableます。

PS C:\> Run-MyScript.ps1 | Format-Table

彼らは本当にPowerShell PowerObjectandPipingShellを呼び出す必要があります。


4
ボブに感謝します。mjolinorの質問に直接答えると感じたので、mjolinorの回答を受け入れました。ありがとう!
ジョン

1
同じ手法が機能し、おそらくWrite-VerboseまたはWrite-Debugでの使用により適しています。
mjolinor 2013

4
私は知っています、私は何年も遅れていますが、私はNever use Write-Host.発言に同意しません。関数を「汚染」するため、データを返す関数内でWrite-Outputを使用することはできません。簡単な例。ReturnText関数が出力するものを推測しますか?これが、関数内で常に書き込みホストを使用する理由です。function ReturnText(){Write-Output "Some random message" return "What
you

3
@DenisMolodtsov私は完全に同意します。情報をログに記録するために、関数が自明でない限り、Write-Outputを使用しないでください。複数の関数レベルがあり、出力を返す必要がある場合は、別のものを使用する必要があり、Write-Hostはその要件を満たします。
RobG、

2
Write-Hostは、リモートセッションからすぐに戻され、進行状況を確認できます。リモートセッションがエラーをスローした場合、Write-Output情報は失われます。
RobG、

3

一般的な注意事項。


$obj | Select-Object $obj | Select-Object -Property *

後者は、組み込みではなく、コンパイラによって生成されないすべてのプロパティを表示します。前者はすべてのプロパティタイプを(常に)表示するように見えませ(私のテストでは、一貫して表示するように見えます-ここでは保証はありません)。CodeProperty MemberType


Get-Memberについて知っておくべきいくつかのスイッチ

  • Get-Memberデフォルトでは静的メンバーを取得しませ。非静的メンバーと一緒に(直接)取得することもできません。つまり、スイッチを使用すると、静的メンバーのみが返されます。

    PS Y:\Power> $obj | Get-Member -Static
    
       TypeName: System.IsFire.TurnUpProtocol
    
    Name        MemberType Definition
    ----        ---------- ----------
    Equals      Method     static bool Equals(System.Object objA, System.Object objB)
    ...
  • を使用し-Forceます。

    このGet-Memberコマンドは、Forceパラメーターを使用して、オブジェクトの組み込みメンバーとコンパイラー生成メンバーを表示に追加します。Get-Memberこれらのメンバーを取得しますが、デフォルトでは非表示になります。

    PS Y:\Power> $obj | Get-Member -Static
    
       TypeName: System.IsFire.TurnUpProtocol
    
    Name          MemberType     Definition
    ----          ----------     ----------
    ...
    pstypenames   CodeProperty   System.Collections.ObjectModel.Collection...
    psadapted     MemberSet      psadapted {AccessRightType, AccessRuleType,...
    ...

使用する ConvertTo-Json深さと読める「直列化」のために

JSONを使用してオブジェクトを保存することお勧めしませんExport-Clixml代わりに使用してください)。ただし、多少読みやすい出力をから取得ConvertTo-Jsonできます。これにより、深度を指定することもできます。

指定しないことはDepth-Depth 2

PS Y:\Power> ConvertTo-Json $obj -Depth 1
{
    "AllowSystemOverload":  true,
    "AllowLifeToGetInTheWay":  false,
    "CantAnyMore": true,
    "LastResortOnly": true,
...

そして、あなたがそれを読むつもりでないなら、あなたはそれをする-Compressことができます(すなわち空白を取り除く)

PS Y:\Power> ConvertTo-Json $obj -Depth 420 -Compress

使用-InputObject可能な場合は(と喜んでいます)

PowerShellを使用する場合の時間の99.9%:パフォーマンスが問題にならないか、パフォーマンスを気にしません。 ただし、必要のないときにパイプを回避すると、オーバーヘッドを節約して速度を上げることができることに注意してください(一般的に、パイプは効率が良くありません)。

つまり、あなたが持っているすべてが$obj印刷するのに単一の便利なものである場合(そして私が時々タイプアウトするのに余りに怠惰ではない場合-InputObject):

# select is aliased (hardcoded) to Select-Object
PS Y:\Power> select -Property * -InputObject $obj
# gm is aliased (hardcoded) to Get-Member
PS Y:\Power> gm -Force -InputObject $obj

注意点Get-Member -InputObject $ objがコレクション(たとえばSystem.Object[])の場合、コレクションオブジェクト自体に関する情報を取得することになります。

PS Y:\Power> gm -InputObject $obj,$obj2
   TypeName: System.Object[]

Name        MemberType            Definition
----        ----------            ----------
Count       AliasProperty         Count = Length
...

あなたがしたい場合はGet-Member、それぞれのためTypeNameのコレクションに(それぞれのNB TypeNameいない各オブジェクトの- Nのコレクションは、すべて同じでオブジェクトTypeNameの意志だけで、そのために1つの表を印刷するTypeName各オブジェクトのではなく、Nテーブル)......そのまま配管するだけ。


1

以下は私にとって本当にうまくいった。私は上記のすべての回答にパッチを当て、次のリンクでオブジェクトのプロパティの表示について読み、オブジェクトの印刷について以下の短い読みを思いつきました

次のテキストをprint_object.ps1という名前のファイルに追加します。

$date = New-Object System.DateTime
Write-Output $date | Get-Member
Write-Output $date | Select-Object -Property *

powershellコマンドプロンプトを開き、そのファイルが存在するディレクトリに移動して、次のように入力します。

powershell -ExecutionPolicy ByPass -File is_port_in_use.ps1 -Elevated

「System.DateTime」を、印刷したいオブジェクトに置き換えてください。オブジェクトがnullの場合、何も出力されません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.