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
如何更改对象中已有的项目?
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
我想在 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
还是我做错了?这个想法来自于从函数返回大量变量的困难,我读到使用对象在函数中来回传递要好得多,并且发现使用对象更容易跟踪并在一定程度上操纵。
干杯!
如果我们保留您当前的 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