PowerShell: добавление «строк» ​​в пользовательский объект - PullRequest
0 голосов
/ 09 мая 2019

Я хочу создать объект в powershell, который хранит информацию о состоянии скрипта.Я могу сделать это:

$myScriptObject = 
    @("status", "Selected Operation(s):", "None"), 
     ("status", "Current Operation:", "None"), 
     ("status", "Current Step:", "Prompting for Script Action" ),
     ("test", "This is just for testing", "1,2,3") `
    | ForEach-Object {[pscustomobject]@{kind = $_[0]; name = $_[1]; value 
= $_[2]}}

И это работает:

$myScriptObject

kind   name                     value                      
----   ----                     -----                      
status Selected Operation(s):   None                       
status Current Operation:       None                       
status Current Step:            Prompting for Script Action
test   This is just for testing 1,2,3 

... и я могу даже сделать это:

foreach($myObject in $myScriptObject) {
    if ($myObject.kind -eq 'status') {
        Write-Host $myObject.name $myObject.value
    }
}

, который выводит это:

Selected Operation(s): None
Current Operation: None
Current Step: Prompting for Script Action

Мои вопросы: 1. Как мне добавить что-то вроде следующего в $ myScriptObject:

-kind "ActionMenuChoice" -Name "Do This" -Value 1
-kind "ActionMenuChoice" -Name "Do That" -Value 2

Как изменить элементы, уже находящиеся в объекте?

status Current Step: Prompting for Script Action

на

status Current Step:            Prompting for Login

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

Ура!

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Если мы сохраняем вашу текущую структуру массива объектов, вы можете создать $myScriptObject как тип общего списка, приведя [collections.generic.list[object]]. Затем вы можете использовать метод .Add() для добавления элементов в вашу коллекцию.

[collections.generic.list[object]]$myScriptObject = 
    @("status", "Selected Operation(s):", "None"), 
     ("status", "Current Operation:", "None"), 
     ("status", "Current Step:", "Prompting for Script Action" ),
     ("test", "This is just for testing", "1,2,3") |
        ForEach-Object {[pscustomobject]@{kind = $_[0]; name = $_[1]; value = $_[2]}}

[void]$myScriptObject.add([pscustomobject]@{"Kind" = "ActionMenuChoice"; "Name" = "Do This"; "Value" = 1})
[void]$myScriptObject.add([pscustomobject]@{"Kind" = "ActionMenuChoice"; "Name" = "Do That"; "Value" = 2})

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

($myScriptObject | Where-Object {$_.name -eq 'Current Step:'}).value = "Prompting for Login"

Where-Object может предоставить условие, необходимое для определения местоположения целевого объекта. Затем вы можете использовать синтаксис object.property для доступа к свойству. С объектами PowerShell вы можете выполнить синтаксис прямого назначения (object.property = value) для обновления значения свойства.

0 голосов
/ 09 мая 2019

Вместо этого я бы использовал datatable:

Add-Type -AssemblyName System.Collections

$dt = New-Object system.Data.DataTable
[void]$dt.Columns.Add('kind',[string]::empty.GetType() )
[void]$dt.Columns.Add('name',[string]::empty.GetType() )
[void]$dt.Columns.Add('value',[string]::empty.GetType() )


# Add new rows:
$newRow = $dt.NewRow()
$newRow.kind = 'status'
$newRow.name = 'Selected Operation(s):'
$newRow.value = 'None'

[void]$dt.Rows.Add( $newRow )

$newRow = $dt.NewRow()
$newRow.kind = 'status'
$newRow.name = 'Selected'
$newRow.value = 'None'

[void]$dt.Rows.Add( $newRow )


# Find row(s):
$rows = $dt.Select("kind = 'status'")
"Found:"
$dt

# Change first row by condition:
$rows = $dt.Select("kind = 'status'")
$rows[0].value = 'test'
[void]$dt.AcceptChanges()
"Changed one row:"
$dt

# Change all rows:
$rows = $dt.Select("")
$rows | % { $_.value = 'new' }
[void]$dt.AcceptChanges()
"Changed all:"
$dt

# Change all rows by condition:
$rows = $dt.Select("name = 'Selected'")
$rows | % { $_.value = 'newer' }
[void]$dt.AcceptChanges()
"Changed by condition:"
$dt
...