【发布时间】:2019-03-19 17:04:55
【问题描述】:
假设我有一个方法可以获取我的枚举类型ProjectName 的枚举集合,并且有一个Server 对象的集合,我想将这些ProjectNames 关联到一个名为Project 的类型中;我将如何在 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 中使用花括号,但我不确定如何在 Select-Object 中创建新的 Project 对象。
【问题讨论】:
-
用
ForEach-Object替换Select-Object -
顺便说一句:
GetProjectNames()应该是GetProjectNames,因为 PowerShell cmdlet 和函数的调用方式类似于 shell 命令,而不是 方法。也就是说,参数列表周围没有括号,并且以 空格 分隔的参数(,将 array 构造为 单个参数)。
标签: linq powershell projection