Ste*_*eDJ 51 powershell pscustomobject
首先,因为这引出了我的问题,我首先要指出我在PowerShell中使用了XML,以及如何将XML文件中的数据快速地读入自定义对象数组.例如,如果我有以下XML文件:
<stuff>
<item name="Joe" age="32">
<info>something about him</info>
</item>
<item name="Sue" age="29">
<info>something about her</info>
</item>
<item name="Cat" age="12">
<info>something else</info>
</item>
</stuff>
Run Code Online (Sandbox Code Playgroud)
如果我简单地阅读它,就像这样:
[xml]$myxml = Get-Content .\my.xml
Run Code Online (Sandbox Code Playgroud)
然后我可以得到一个像我这样的项目数组:
[array]$myitems = $myxml.stuff.Item
$myitems
name age info
---- --- ----
Joe 32 something about him
Sue 29 something about her
Cat 12 something else
Run Code Online (Sandbox Code Playgroud)
那么,现在我的问题是:
如何创建自定义对象数组的类似结构,并在我的脚本中初始化它们,而无需读取文件?
我可以做很多循环和/或大量创建/初始化单个对象,然后一次添加一个数组...
但似乎应该有一种方法以更简单的方式执行此创建/初始化.请注意,这里的关键是我的自定义对象有两个以上的元素(否则,我已经使用了哈希).
我甚至考虑过创建一个大的XML字符串,并使用Select-XML,但我只是无法正确使用语法(如果这是正确的方向,那就是正确的方向).
And*_*ykh 69
我会沿着这些方向做点什么:
$myitems =
@([pscustomobject]@{name="Joe";age=32;info="something about him"},
[pscustomobject]@{name="Sue";age=29;info="something about her"},
[pscustomobject]@{name="Cat";age=12;info="something else"})
Run Code Online (Sandbox Code Playgroud)
请注意,这仅适用于PowerShell 3,但由于您没有在问题中提及该版本,我认为这对您无关紧要.
更新
评论中提到过,如果您执行以下操作:
$younger = $myitems | Where-Object { $_.age -lt 20 }
Write-Host "people younger than 20: $($younger.Length)"
Run Code Online (Sandbox Code Playgroud)
你不会得到1你所期望的.pscustomobject返回单个时会发生这种情况.现在,这是不是在PowerShell中大多数其他对象的问题,因为他们有替代性Length和Count.不幸的pscustomobject是没有.这在Powershell 6.1.0中得到修复.您可以使用运算符解决此问题@():
$younger = @($myitems | Where-Object { $_.age -lt 20 })
Run Code Online (Sandbox Code Playgroud)
Sha*_*tin 28
这是在PowerShell中初始化自定义对象数组的简明方法.
> $body = @( @{ Prop1="1"; Prop2="2"; Prop3="3" }, @{ Prop1="1"; Prop2="2"; Prop3="3" } )
> $body
Name Value
---- -----
Prop2 2
Prop1 1
Prop3 3
Prop2 2
Prop1 1
Prop3 3
Run Code Online (Sandbox Code Playgroud)
Joe*_*ith 22
也许你的意思是这样的?我喜欢创建一个对象并使用Format-Table:
PS C:\Users\Joel> $array = @()
PS C:\Users\Joel> $object = New-Object -TypeName PSObject
PS C:\Users\Joel> $object | Add-Member -Name 'Name' -MemberType Noteproperty -Value 'Joe'
PS C:\Users\Joel> $object | Add-Member -Name 'Age' -MemberType Noteproperty -Value 32
PS C:\Users\Joel> $object | Add-Member -Name 'Info' -MemberType Noteproperty -Value 'something about him'
PS C:\Users\Joel> $array += $object
PS C:\Users\Joel> $array | Format-Table
Name Age Info
---- --- ----
Joe 32 something about him
Run Code Online (Sandbox Code Playgroud)
这将根据属性将数组中的所有对象放入列中.
提示:-auto更好地使用表格的大小
PS C:\Users\Joel> $array | Format-Table -Auto
Name Age Info
---- --- ----
Joe 32 something about him
Run Code Online (Sandbox Code Playgroud)
您还可以在表中指定所需的属性.只需用逗号分隔每个属性名称:
PS C:\Users\Joel> $array | Format-Table Name, Age -Auto
Name Age
---- ---
Joe 32
Run Code Online (Sandbox Code Playgroud)
小智 12
初始化数组的最简单方法
创建数组
$array = @()
Run Code Online (Sandbox Code Playgroud)
创建标题
$line = "" | select name,age,phone
Run Code Online (Sandbox Code Playgroud)
填写这条线
$line.name = "Leandro"
$line.age = "39"
$line.phone = "555-555555"
Run Code Online (Sandbox Code Playgroud)
添加行到$ array
$array += $line
Run Code Online (Sandbox Code Playgroud)
结果
$array
name age phone
---- --- -----
Leandro 39 555-555555
Run Code Online (Sandbox Code Playgroud)
dav*_*igh 10
这是一个更简洁的接受答案版本,它避免重复NoteProperty标识符和[pscustomobject]-cast:
$myItems = ("Joe",32,"something about him"), ("Sue",29,"something about her")
| ForEach-Object {[pscustomobject]@{name = $_[0]; age = $_[1]; info = $_[2]}}
Run Code Online (Sandbox Code Playgroud)
结果:
> $myItems
name age info
---- --- ----
Joe 32 something about him
Sue 29 something about her
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
131268 次 |
| 最近记录: |