如何在Powershell中将对象集合转换为另一种类型的新对象集合?

问题描述 投票:2回答:1

假设我有一个方法获取我的枚举类型ProjectName的枚举的集合,并且有一个Server对象的集合,我想与ProjectName类型中的那些Projects相关联;我将如何在Powershell Select-Object(或其他一些LINQ的Select)中做到这一点。

我想在Powershell中生成的C#相当于:

var servers = new[]
{
    new Server(/*someOtherProjectsCollection goes here*/),
    new Server(/*someOtherProjectsCollection goes here*/),
    new Server(/*someOtherProjectsCollection goes here*/)
};
var projects = GetProjectNames().Select(projectName => new Project(projectName, servers.Where(server => server.Projects.Any(serverProject => serverProject.Name == projectName))));

但我所拥有的是:

$servers = [Server]::new(/*someOtherProjectsCollection goes here*/), [Server]::new(/*someOtherProjectsCollection goes here*/), [Server]::new(/*someOtherProjectsCollection goes here*/)

$projects = (GetProjectNames()) | Select-Object {
    $selectedProjectName = $_

    return [Project]::new($_, ($servers | Where-Object { $_.projects.Where({ $_ -eq $selectedProjectName }).Count -gt 0 }))
}

当我尝试在Powershell LSE中读取$projects时(在最后一行之后的断点处),它只是将代码作为字符串返回,我甚至无法将其转换为[Project[]]。我认为问题可能是使用Select-Object的大括号,但我不知道如何在Project中创建一个新的Select-Object对象。

linq powershell projection
1个回答
2
投票

你想要ForEach-Object而不是Select-Object为每个项目名称返回一个新的[Project]实例;此外,您的代码可以简化:

$projects = GetProjectNames | ForEach-Object {
    $projectName = $_
    [Project]::new(
      $_, 
      $servers.Where({ $_.projects -eq $projectName })
    )
}
  • Select-Object用于根据输入对象中的select属性创建新的自定义对象;相反,您正在从每个输入对象构造一个新的特定类型实例,这必须在ForEach-Object调用中完成,您可以在其中显式控制输出。
  • $_.projects -eq $projectName作为条件依赖于PowerShell能够将-eq与数组一起用作LHS,在这种情况下执行过滤,并返回过滤后的子数组;由于.Where()将脚本块的输出解释为布尔值,因此空子阵列被解释为$false,而具有至少一个元素的子阵列被解释为$true
  • 另请注意,鉴于PowerShell的隐式输出行为,您不需要显式的return:由于新构造的[Project]实例未分配给变量或发送到其他地方,因此会自动返回。
© www.soinside.com 2019 - 2024. All rights reserved.