PowerShell:将 "rows" 添加到自定义对象

PowerShell: Adding "rows" to custom object

我想在 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
  1. 如何更改对象中已有的项目?

    status Current Step: Prompting for Script Action

status Current Step:            Prompting for Login

还是我做错了?这个想法来自于从函数返回大量变量的困难,我读到使用对象在函数中来回传递要好得多,并且发现使用对象更容易跟踪并在一定程度上操纵。

干杯!

如果我们保留您当前的 object 数组结构,您可以通过强制转换 [collections.generic.list[object]] 创建 $myScriptObject 作为通用列表类型。然后您可以使用 .Add() 方法将项目添加到您的 collection.

[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})

如果您想更新 collection 中的项目 属性,您首先需要在 collection 中找到 object/item,然后访问 属性你要更新。

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

Where-Object可以提供定位目标所需的条件object。然后您可以使用 object.property 语法访问 属性。使用 PowerShell objects,您可以执行直接赋值语法 (object.property = value) 来更新 属性 值。

我会改用数据表:

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