arrays - ليس كل الخصائص المعروضة



powershell properties (1)

عندما نحاول تصدير البيانات إلى وظائف أخرى عبر خط الأنابيب ، نلاحظ بعض السلوك الغريب في PowerShell.

رمز المثال:

$Array = @()

$Obj1 = [PSCustomObject]@{
    Member1   = 'First'
    Member2   = 'Second'
}

$Obj2 = [PSCustomObject]@{
    Member1   = 'First'
    Member2   = 'Second'
    Member3   = 'Third'
}

$Array = $Obj1, $Obj2
$Array | Out-GridView -Title 'Not showing Member3'

$Array = $Obj2, $Obj1
$Array | Out-GridView -Title 'All members correctly displayed'

في المثال أعلاه ، يمكنك أن ترى أنه عندما يحتوي الكائن الأول فقط على properties ، فإن Out-GridView CmdLet (وغيرها) لا يعرض سوى 2 من properties ، على الرغم من أن الكائن الثاني له 3 properties . ومع ذلك ، عندما يحتوي الكائن الأول في الصفيف على 3 properties فإنه يعرضها كلها بشكل صحيح.

هل هناك طريقة للتغلب على ذلك؟ لأنه لا يمكن التنبؤ مقدماً بعدد properties الموجودة على كائن ما وإذا كان الكائن الذي يحتوي على أكثر properties سيكون الأول في array .


حصلت على نفس التجربة مرة واحدة وقمت بإنشاء وظيفة " Union " التالية القابلة لإعادة الاستخدام:

Function Union {
    $Union = @()
    $Input | ForEach {
        If ($Union.Count) {$_ | Get-Member | Where {!($Union[0] | Get-Member $_.Name)} | ForEach {$Union[0] | Add-Member NoteProperty $_.Name $Null}}
        $Union += $_
    }
    $Union
}

الاستعمال:

$Obj1, $Obj2 | Union | Out-GridView -Title 'Showing all members'

ومن المفترض أيضا أن تعمل مع الأشياء المعقدة. تقوم بعض أوامر cmdlets القياسية بإخراج أنواع متعددة من الكائنات في وقت واحد ، وإذا قمت بعرضها (مثل Out-GridView ) أو تفريغها في ملف (على سبيل المثال Export-Csv ) فقد تفوتك الكثير من الخصائص. خذ مثالاً آخر:

Get-WmiObject -Namespace root/hp/instrumentedBIOS -Class hp_biosSetting | Union | Export-Csv ".\HPBIOS.csv"

أضيفت 19-19:

ربما يكون هذا بالفعل بين السطور في التعليقات $Array | Select * | … $Array | Select * | … $Array | Select * | … لن يحل المشكلة ولكن تحديد الخصائص $Array | Select Member1, Member2, Member3 | … $Array | Select Member1, Member2, Member3 | … $Array | Select Member1, Member2, Member3 | … لا.
إضافة إلى ذلك ، على الرغم من أن وظيفة Union ستعمل في معظم الحالات ، إلا أن هناك بعض الاستثناءات لذلك لأنها ستحاذي الكائن الأول فقط مع الباقي. النظر في الكائن التالي:

$List = @(
    New-Object PSObject -Property @{Id = 2}
    New-Object PSObject -Property @{Id = 1}
    New-Object PSObject -Property @{Id = 3; Name = "Test"}
)

إذا كنت Union هذا الكائن ، يبدو أن كل شيء على ما يرام وإذا قمت على سبيل المثال ExportTo-CSV وتعمل مع ملف export .csv من ذلك الحين ، فلن تواجه أي مشكلة.

$List | Union
Id Name
-- ----
 2
 1
 3 Test

لا يزال هناك الصيد كما هو محاذاة الكائن الأول فقط. إذا قمت على سبيل المثال بفرز النتيجة على Id ( Sort Id ) أو تأخذ فقط آخر 2 ( Select -Last 2 ) ، فلن يتم سرد Name لأن الكائن الثاني لا يحتوي على خاصية Name :

$List | Union | Sort Id
Id
--
 1
 2
 3

لذلك قمت بإعادة كتابة وظيفة Union-Object (Alias Union ) ():

الاتحاد كائن

Function Union-Object ([String[]]$Property = @()) {         # Version 00.02.01, by iRon
    $Objects = $Input | ForEach {$_}
    If (!$Property) {ForEach ($Object in $Objects) {$Property += $Object.PSObject.Properties | Select -Expand Name}}
    $Objects | Select ([String[]]($Property | Select -Unique))
} Set-Alias Union Union-Object

بناء الجملة:

$Array | Union | Out-GridView -Title 'All members correctly displayed'

للحصول على أحدث إصدار Union-Object ، راجع: https://powersnippets.com/union-object/





properties