PowerShell:如何初始化自定义对象数组

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中大多数其他对象的问题,因为他们有替代性LengthCount.不幸的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)

  • 正是我在寻找的东西.谢谢! (4认同)
  • 这当然是一个哈希表数组,而不是_自定义对象的数组。_ (4认同)

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)

  • @Yiping:您必须正确使用逗号运算符,请参见[here](http://stackoverflow.com/questions/11138288/how-to-create-array-of-arrays-in-powershell)。基本上是`$ myItems =,(“ Sue”,29,“关于她的事”)| ...` (2认同)