arrays - সমস্ত বৈশিষ্ট্য প্রদর্শিত হয় না



powershell properties (1)

আমি একবার একই অভিজ্ঞতা পেয়েছি এবং নিম্নলিখিত পুনরায় ব্যবহারযোগ্য ' 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'

এটি জটিল বস্তুগুলির সাথেও কাজ করার কথা রয়েছে। কিছু স্ট্যান্ডার্ড সেমিডলেট একসাথে একাধিক অবজেক্টের আউটপুট দেয় এবং যদি আপনি সেগুলি দেখতে পান (যেমন, Out-GridView ) বা কোনও ফাইলে ডাম্প করে (যেমন Export-Csv ) আপনি প্রচুর সম্পত্তি মিস করতে পারেন। অন্য উদাহরণ হিসাবে নিন:

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

যোগ করা হয়েছে 2014-09-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"}
)

আপনি যদি ExportTo-CSV তবে এই বস্তুটি সবকিছু ঠিক আছে বলে মনে হয় এবং যদি আপনি উদাহরণস্বরূপ ExportTo-CSV এবং তখন থেকে export .csv ফাইলের সাথে কাজ করেন তবে আপনার কখনই কোনও সমস্যা হবে না।

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

কেবল প্রথম বস্তুটি সারিবদ্ধ হওয়ার পরেও সেখানে একটি ক্যাচ রয়েছে। আপনি উদাহরণস্বরূপ Id উপর ফলাফল বাছাই করুন ( Id Sort Id ) বা কেবল সর্বশেষ 2 ( Select -Last 2 ) এন্ট্রি নিলে Name তালিকাভুক্ত নয় কারণ দ্বিতীয় বস্তুতে Name বৈশিষ্ট্য নেই:

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

এর জন্য আমি Union-Object (এলিয়াস 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/

আমরা যখন পাইপলাইনের মাধ্যমে অন্যান্য ফাংশনে ডেটা রফতানি করার চেষ্টা করি তখন আমরা পাওয়ারশেলের কিছু অদ্ভুত আচরণ লক্ষ্য করি।

উদাহরণ কোড:

$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'

উপরের উদাহরণে আপনি দেখতে পাচ্ছেন যে যখন প্রথম অবজেক্টটিতে কেবল 2 টি properties থাকে তখন Out-GridView সিএমডিলেট (এবং অন্যান্য) কেবল 2 টি properties দেখায়, যদিও দ্বিতীয় বস্তুর 3 টি properties । যাইহোক, যখন অ্যারেতে প্রথম অবজেক্টে 3 টি properties তা সেগুলি সমস্ত সঠিকভাবে প্রদর্শন করে।

এই সমস্যা এড়ানোর একটি উপায় আছে কি? কারণ সেখানে কোন বস্তুর কতটি properties থাকবে তা যদি ভবিষ্যদ্বাণী করা সম্ভব হয় না এবং যদি সর্বাধিক properties বস্তুটি array মধ্যে প্রথম হয়।