首页 > 解决方案 > PowerShell:向自定义对象添加“行”

问题描述

我想在 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

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

干杯!

标签: powershellobjectdynamic-arrays

解决方案


如果我们保留您当前的对象数组结构,您可以$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) 来更新属性值。


推荐阅读