Создание и модификация объектов в Powershell - PullRequest
3 голосов
/ 25 февраля 2020

Я новичок ie из PowerShell, сейчас я начинаю смотреть на объекты и т.д. c. Я создаю объект следующим образом:

$myObject = [PSCustomObject]@{
  ComputerName = "abc"
  Data = "xxx"
}

Если я напечатаю $myObject, то получу:

   ComputerName Data
   ------------ ----
   abc          xxx

И все в порядке, теперь я хочу добавить свойство этого объекта, и я увидел (скажите, если я не прав), что я могу сделать это двумя способами: с add-member и с select-object Например, с add-member, что я сделал:

$myObject | Add-member -NotePropertyName Level -NotePropertyValue Highest

Вместо Select-object я сделал:

$myobject = 2 (cause i want to add 2 properties, is it right?) | Select-Object -Property Level, Privilege
$myobject.Level = "High"
$myobject.Privilege = "Elevated"

Теперь, если я бегу $myobject, я все равно получаю только:

   ComputerName Data
   ------------ ----
   abc          xxx
  1. Что мне делать сделать, чтобы увидеть все данные, даже те, которые я добавил позже?
  2. Можно ли напрямую добавить значения к свойствам, добавленным через Select-Object? Спасибо

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Вы можете использовать метод Add-Member для объекта PsCustomObject.

$myObject = [PSCustomObject]@{
ComputerName = "abc"
Data = "xxx"
}

$myObject | Add-Member -NotePropertyName Level -NotePropertyValue High
$myObject | Add-Member Privilege Elevated

$myObject

#Output looks like,

ComputerName Data Level Privilege
------------ ---- ----- ---------
abc          xxx  High  Elevated 

Обновление

Не знаю, почему, но Подробнее об этом ...

Если вы напечатаете объект Pscustomobject, а затем запустите add-member, они, похоже, будут проигнорированы. Если вы создаете хеш-таблицу, обновляете ее и затем конвертируете в PsObject, это работает. Ниже приведен пример этой хеш-таблицы

$myObject = @{
ComputerName = "abc"
Data = "xxx"
}
$myObject | ft

$myObject.Add("Level", "high")
$myObject.Add("Privilege", "Elevated")

[pscustomobject] $myObject | ft

Что я нашел

Когда вы печатаете $ myObject, затем добавляете данные, данные добавляются, но не отображаются. Это связано с каким-то неизвестным мне внутренним механизмом, который продолжает использовать те же заголовки из предыдущей команды.

Если вы заметили, данные печатаются дважды под одним заголовком. Если вы хотите увидеть различия до и после, направьте их в формат-список или таблицу-формат, чтобы каждый раз использовать другой выходной поток.

$myObject = [PSCustomObject]@{
ComputerName = "abc"
Data = "xxx"
}
$myObject | ft

$myObject | Add-Member -NotePropertyName Level -NotePropertyValue High -Force
$myObject | Add-Member Privilege Elevated

$myObject | ft
0 голосов
/ 25 февраля 2020

Вы можете использовать либо Add-Member, либо Select-Object. Отвечая на достоинства или недостатки в различных ситуациях, я просто хочу добавить пример Select-Object. Просто у вас есть оба метода:

В этом примере будет отображен объект с выбранными свойствами:

$myObject | 
Select-Object *,
    @{Name = 'Level'; Expression = { 'High' } },
    @{Name = 'Privilege'; Expression = { 'Elevated' } }

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

$myObject = $myObject | 
Select-Object *,
    @{Name = 'Level'; Expression = { 'High' } },
    @{Name = 'Privilege'; Expression = { 'Elevated' } }

PowerShell позволяет предоставить таблицу ha sh для определения новых свойств. Вы заметите, что это выглядит довольно похоже на ха sh, который вы использовали для создания объекта. Обычно выражение использует синтаксис $ _ для вычисления значения свойства. Здесь вы часто будете называть рассчитанные свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...