Итерация над свойствами PSObject в PowerShell

У меня есть этот PSObject (из XML):

bool : {IsActive, ShowOnB2C, ShowOnB2B, IsWebNews}
str  : {id, ProductId, GroupName, Unit...}
int  : {ProductIdNumeric, Prices_SalesOne, Prices_Treater, Prices_B2C...}
arr  : {EnvironmentBrands, Catalogs, NavisionLevels}
long : long

Я хотел бы перебирать свойства без использования имен свойств, например bool.

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

$document[0]

Но это ничего не дает, но это тоже не вызывает никаких ошибок.

Select-Object, но я должен использовать имена свойств, и я не хочу этого.

$documents | Select-Object bool,str

ForEach не перебирает свойства.

$documents | ForEach {
    $_.name
}

возвращает doc, и это имя тега (XML), содержащего bools, ints и строки.

Ответ 1

Это возможно с помощью скрытого свойства PSObject:

$documents.PSObject.Properties | ForEach-Object {
    $_.Name
    $_.Value
}

Ответ 2

Я предпочитаю использовать foreach для прокрутки объектов PowerShell:

foreach($object_properties in $obj.PsObject.Properties)
{
    # Access the name of the property
    $object_properties.Name

    # Access the value of the property
    $object_properties.Value
}

Как правило, foreach имеет более высокую производительность, чем Foreach-Object.

И да, foreach на самом деле отличается от Foreach-Object под капотом.

Ответ 3

Как и в случае с stj, имеется командлет Get-Member с параметром -MemberType вы можете использовать:

$documents | Get-Member -MemberType Property | ForEach-Object {
    $_.Name
}

Ответ 4

Вам также может понадобиться NoteProperty с Get-Member.

$documents | Get-Member -membertype property,noteproperty | 
  Foreach name

РЕДАКТИРОВАТЬ: сбросить все значения:

$obj = ls test.ps1
$obj | Get-Member -Type property | foreach name | 
  foreach { "$_ = $($obj.$_)" }

Attributes = Normal
CreationTime = 06/01/2019 11:29:03
CreationTimeUtc = 06/01/2019 15:29:03
Directory = /Users/js
DirectoryName = /Users/js
Exists = True
Extension = .ps1
FullName = /Users/js/test.ps1
IsReadOnly = False
LastAccessTime = 06/05/2019 23:19:01
LastAccessTimeUtc = 06/06/2019 03:19:01
LastWriteTime = 06/01/2019 11:29:03
LastWriteTimeUtc = 06/01/2019 15:29:03
Length = 55
Name = test.ps1