在Powershell中加入两个结果
我有两个cmdlet返回对象列表。一个返回SPSolution类型的对象,其中包含属性Id,另一个返回SPFeature类型的对象,其中包含属性SolutionId 现在我想加入/合并这些数据,如下所示:在Powershell中加入两个结果,powershell,join,cmdlets,Powershell,Join,Cmdlets,我有两个cmdlet返回对象列表。一个返回SPSolution类型的对象,其中包含属性Id,另一个返回SPFeature类型的对象,其中包含属性SolutionId 现在我想加入/合并这些数据,如下所示: $f = Get-Feature $s = Get-Solution $result = <JOIN> $f $s <ON> $f.SolutionId = $s.Id <SELECT> FeatureName = $
$f = Get-Feature
$s = Get-Solution
$result = <JOIN> $f $s
<ON> $f.SolutionId = $s.Id
<SELECT> FeatureName = $f.DisplayName, SolutionName = $s.Name
$f=获取功能
$s=获取解决方案
$result=$f$s
$f.SolutionId=$s.Id
FeatureName=$f.DisplayName,SolutionName=$s.Name
它的效率不高,它采用PowerShell 2,但它应该可以完成以下任务:
$solutions = Get-Solution
foreach ($f in Get-Feature) {
$filteredSolutions = $solutions |
where-object { $_.Id -eq $f.SolutionId }
foreach ($s in $filteredSolutions) {
new-object PSObject -prop @{
FeatureName = $f.DisplayName
SolutionName = $s.Name
}
}
}
请注意,我没有安装SharePoint,因此我恐怕无法测试它 这里有一个单衬里可以实现这一点(依赖于嵌套管道):
它很简单,可能需要更多的工作,但它确实做到了
function Join-Object {
param ( [PSObject[]] $objects, $where, $proplist)
for ($i=0;$i -le $objects.length;$i++) {
if ($objects[$i+1] -ne $null) {$out += $objects[$i] | %{$o=$_;$objects[$i+1] | where $where | Select -property $proplist} } };
$out
}
$其中
是脚本块,$proplist
是为选定对象格式化的属性数组它适用于传入两个对象。希望它能起到更多的作用,但还没有尝试过。以基思·希尔所说的为基础 将其制作为2衬板可大大提高效率。这样,对于Get特性返回的每个对象,您只需运行一次Get解决方案,而不是再次运行
$Solutions = Get-Solution
Get-Feature | % {$f = $_; $Solutions | ? {$f.SolutionId -eq $_.Id} |
Select Name,@{n='FeatureName';e={$f.DisplayName}}}
请参阅:谢谢,它完成了任务。但我真的希望有一个CMDlet用于此类操作…这里有一个非常非常古老的东西(从PowerShell还被称为Monad时开始),它描述了一个Join-Object CMDlet。它太旧了,使用了不同的语法:即使在PowerShell 2.0中也没有Join-Object cmdlet。@Kieth Hill:这篇文章描述了一个潜在的实现,而不是PowerShell的一部分。感谢这篇文章,我喜欢这个实现。遗憾的是,它只允许返回第一个或第二个数据源。我正在考虑从那里构建我自己的连接对象。。。或者开始悬赏建造它;-)美好的没有意识到你可以将“Name”和“Expression”缩写为“n”和“e”。也在PS1中工作。虽然,可读性不强!;)不,可读性不是很强,但是如果你在提示下把东西敲出来,能够做到这一点是很好的。
$Solutions = Get-Solution
Get-Feature | % {$f = $_; $Solutions | ? {$f.SolutionId -eq $_.Id} |
Select Name,@{n='FeatureName';e={$f.DisplayName}}}
(Get-Feature | Select @{Name="FeatureName";Expression={$_.DisplayName}) | Join (Get-Solution | Select @{Name="SolutionName";Expression={$_.Name}) SolutionId -eq Id