powershell - 如何初始化自定义对象数组

标签 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>

如果我简单地读一下,就像这样:

[xml]$myxml = Get-Content .\my.xml

然后我可以像这样访问我的项目数组:

[array]$myitems = $myxml.stuff.Item
$myitems

name   age  info
----   ---  ----
Joe    32   something about him
Sue    29   something about her
Cat    12   something else

那么,现在我的问题是:

如何创建类似结构的自定义对象数组,并在脚本中初始化它们,无需读取文件?

我可以进行大量循环和/或大量创建/初始化单个对象,然后一次将一个添加到数组中......

但似乎应该有一种方法以更简单的方式执行此创建/初始化。请注意,这里的关键是我的自定义对象具有两个以上元素(否则,我会使用哈希)。

我什至考虑过创建一个大的 XML 字符串,并使用 Select-XML,但我就是无法获得正确的语法(如果那是正确的方向的话)。

最佳答案

我会按照以下方式做一些事情:

$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"})

请注意,这仅适用于 PowerShell 3,但由于您没有在问题中提及版本,我假设这对您来说并不重要。

更新

评论中提到,如果您执行以下操作:

$younger = $myitems | Where-Object { $_.age -lt 20 } 
Write-Host "people younger than 20: $($younger.Length)" 

您不会得到您所期望的1。当返回单个 pscustomobject 时,就会发生这种情况。现在,对于 PowerShell 中的大多数其他对象来说,这不是问题,因为它们具有 LengthCount 的代理属性。不幸的是,pscustomobject 没有。 此问题已在 PowerShell 6.1.0 中修复。您可以使用运算符 @() 来解决此问题:

$younger = @($myitems | Where-Object { $_.age -lt 20 })

有关更多背景信息,请参阅 herehere .

更新2

在 PowerShell 5 中可以使用 Classes来实现类似的功能。例如,您可以定义这样的类:

class Person {
    [string]$name
    [int]$age
    [string]$info; `
`
    Person(
    [string]$name,
    [int]$age,
    [string]$info
    ){
        $this.name = $name
        $this.age = $age
        $this.info = $info
    }
}

此处的反引号用于将其复制并粘贴到命令行,脚本中不需要它们。定义类后,您可以按照通常的方式创建一个数组:

$myitems =@([Person]::new("Joe",32,"something about him"),
[Person]::new("Sue",29,"something about her"),
[Person]::new("Cat",12,"something else"))

请注意,这种方式不会有之前更新中提到的缺点,即使在 PowerShell 5 中也是如此。

更新3

您还可以使用哈希表初始化类对象,与第一个示例类似。为此,您需要确保定义了默认构造函数。如果您不提供任何构造函数,系统会为您创建一个构造函数,但如果您提供非默认构造函数,则默认构造函数将不存在,您需要显式定义它。以下是自动创建的默认构造函数的示例:

class Person {
    [string]$name
    [int]$age
    [string]$info;
}

有了它,您可以:

$person = @([Person]@{name='Kevin';age=36;info="something about him"}
[Person]@{name='Sue';age=29;info="something about her"}
[Person]@{name='Cat';age=12;info="something else"})

这有点冗长,但也更明确。感谢@js2010 指出了这一点。

关于powershell - 如何初始化自定义对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17353797/

相关文章:

powershell - IIS条件网址重写匹配类型的Powershell脚本

powershell - 为什么用单个字符而不是单个字符串填充PSCustomObject?

json - 如何使用变量访问 powershell PSCustomObject 变量(来自 json)

如果属性有多个值,同时复制其他值,则 Powershell 拆分 PSCustomObject

powershell - PSCustomObject 到哈希表

powershell - 执行功能默认操作,除非给出管道输入?

powershell - 使用 powershell 获取返回对象中的第一个值

azure - 如何将 SAS token 字符串作为文字传递给 Azure CLI?

powershell - 通过Powershell将安全权限附加到文件夹