在Powersh中打印对象属性

在交互式控制台中工作时,如果我定义一个新对象并为其分配一些属性值,如下所示:

$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窗口?

John asked 2019-09-11T11:43:12Z
6个解决方案
141 votes

试试这个:

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

要么

Write-Host ($obj | Format-List | Out-String)
mjolinor answered 2019-09-11T11:43:22Z
20 votes

我对这个问题的解决方案是使用$()子表达式块。

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
David Peters answered 2019-09-11T11:43:56Z
13 votes

在Powershell中打印出对象的属性和值。 以下示例适合我。

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

$ pool |获得会员

   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
...
cateyes answered 2019-09-11T11:44:42Z
10 votes

提示#1

永远不要使用Write-Host。

提示#12

从PowerShell cmdlet或函数输出信息的正确方法是创建包含数据的对象,然后使用Write-Output将该对象写入管道。

-Don Jones:PowerShell Master

理想情况下,您的脚本将创建您的对象($obj = New-Object -TypeName psobject -Property @{'SomeProperty'='Test'}),然后只需执行Write-Output $objects.您可以将输出通过管道传输到Format-Table

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

他们应该真的调用PowerShell PowerObjectandPipingShell。

E.V.I.L. answered 2019-09-11T11:45:50Z
1 votes
# Json to object
$obj = $obj | ConvertFrom-Json
Write-host $obj.PropertyName
Ramanujam Allam answered 2019-09-11T11:46:09Z
0 votes

以下工作对我来说真的很好。 我将所有上述答案拼凑在一起,并在下面的链接中阅读有关显示对象属性的内容,并提出了以下内容关于打印对象的简短介绍

将以下文本添加到名为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,则不会打印任何内容。

Fractal answered 2019-09-11T11:46:58Z
translate from https://stackoverflow.com:/questions/15792650/printing-object-properties-in-powershell