gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:55:23 27 4
gpt4 key购买 nike

首先,由于这引出了我的问题,我首先要指出的是,我在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com