انضم إلى نتيجتين في PowerShell
-
28-09-2019 - |
سؤال
لقد حصلت على اثنين من cmdlets التي تعود قوائم الكائنات. يقوم المرء بإرجاع الكائنات من نوع spsolution ، الذي يحتوي على معرف الخاصية ، وإرجاع الكائنات الأخرى من نوع spfeature مع حل خاصية.
الآن أريد الانضمام/دمج هذه البيانات شيئًا مثل هذا:
$f = Get-Feature
$s = Get-Solution
$result = <JOIN> $f $s
<ON> $f.SolutionId = $s.Id
<SELECT> 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 مثبتة ، لذا أخشى أنه لا يمكنني اختبار هذا!
نصائح أخرى
بناء ما قاله كيث هيل ، مما يجعله بطانة 2 يمكن أن يحسن الكفاءة بشكل كبير. وبهذه الطريقة ، تقوم فقط بتشغيل حل مرة واحدة بدلاً من مرة أخرى لكل كائن يتم إرجاعه عن طريق الحصول على الميزة
$Solutions = Get-Solution
Get-Feature | % {$f = $_; $Solutions | ? {$f.SolutionId -eq $_.Id} |
Select Name,@{n='FeatureName';e={$f.DisplayName}}}
إليك خط واحد يجب أن يقوم بالخدعة (يعتمد على خطوط الأنابيب المتداخلة):
Get-Feature | % {$f = $_; Get-Solution | ? {$f.SolutionId -eq $_.Id} |
Select Name,@{n='FeatureName';e={$f.DisplayName}}}
الأمر بسيط وربما يمكن أن يستخدم المزيد من العمل ، لكنه يقوم بالمهمة.
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
}
$where
هي كتلة نصية ، و $proplist
هي مجموعة من الخصائص المنسقة للاختيار.
إنه يعمل لتمرير كائنين. آمل أن ينجح الأمر أكثر ، لكن لم يحاول ذلك بعد.
(Get-Feature | Select @{Name="FeatureName";Expression={$_.DisplayName}) | Join (Get-Solution | Select @{Name="SolutionName";Expression={$_.Name}) SolutionId -eq Id
نرى: في PowerShell ، ما هي أفضل طريقة للانضمام إلى طاولتين في واحد؟