Печать свойств объекта в Powershell


при работе в интерактивной консоли, если я определяю новый объект и присваиваю ему некоторые значения свойств следующим образом:

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

5 73

5 ответов:

попробуйте это:

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

или

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

мое решение этой проблемы было использовать $ () sub-expression block.

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

чтобы распечатать свойства и значения объекта в Powershell. Ниже примеры работать хорошо для меня.

$бассейн = Вам-товар "IIS:\AppPools.NET В4.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()
...

$бассейн | Выберите объект -собственность * # можно опустить -недвижимость

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

никогда не используйте Write-Host.

Совет #12

правильный способ вывода информации из командлета или функции PowerShell-это создание объекта, содержащего ваши данные, а затем запись этого объекта в конвейер с помощью Write-Output.

-Дон Джонс: PowerShell Мастер

в идеале ваш скрипт будет создавать свои объекты ($obj = New-Object -TypeName psobject -Property @{'SomeProperty'='Test'}), то просто сделать Write-Output $objects. Вы бы передали вывод в Format-Table.

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

они действительно должны называть PowerShell PowerObjectandPipingShell.

# Json to object
$obj = $obj | ConvertFrom-Json
Write-host $obj.PropertyName