আমি পাওয়ারশেলে দুটি বহুমাত্রিক অ্যারে তুলনা করার চেষ্টা করছি। প্রতিটি অ্যারে অনেক হাজার উপাদান রয়েছে - একটি ছোট উদাহরণ অনুসরণ করে। একটি অ্যারেতে আমার কাছে রয়েছে:
$arrOne
Username LocalOffice
john.doe@domain.com US-California
need.help@domain.com IT-Naples
another.example@domain.com TR-Istanbul
(etc...)
অন্যান্য অ্যারেতে, আমার কাছে রয়েছে:
$arrTwo
Username Location
john.doe@domain.com US
need.help@domain.com US
another.example@domain.com TR
(etc...)
আমি কি করতে প্রয়োজন তুলনা হয় LocalOffice প্রতিটি সঙ্গে যুক্ত ব্যবহারকারীর নাম থেকে $ Arrone প্রথম দুই অক্ষর অবস্থান মিলে ব্যবহার ব্যবহারকারীর নাম মধ্যে $ arrTwo (যদি থাকে তাহলে)। তাহলে LocalOffice এবং অবস্থান মিলছে না তারপর কিছু ব্যবস্থাগুলি নিতে। আমার কোডের নমুনাটি নিম্নরূপ:
$arrOne | ForEach-Object {
$strOneName = $_.Username
If ($_.LocalOffice.Length -ge 2)
{
$strOneLocalOffice = $_.LocalOffice.substring(0,2)
}
Else
{
$strOneLocalOffice = "US"
}
$arrTwo | ForEach-Object {
If ($_.Username -eq $strOneName -eq $True)
{
If ($_.Location -eq $strOneLocalOffice -ne $True)
{
## Take action here if they don't match
write-host $_.Username
}
}
}
}
স্ট্যান্ডার্ড নেস্টেড ফরইচ (উপরে) দিয়ে, এই অ্যারেগুলি প্রক্রিয়া করতে কিছুটা সময় লাগে কারণ প্রতিটি অ্যারে বড় হয় (এবং এটি প্রতি 30 মিনিটে চলে এমন স্ক্রিপ্টের অংশ হবে) এবং সময় সংবেদনশীল। আশা করি আমার উত্তরটি খুঁজে পেতে আমার উপরোক্ত সম্পর্কে কয়েকটি প্রশ্ন রয়েছে:
1) Is there some other (quicker) method to get the desired results?
2) Do I have to use ForEach and loop through arrTwo until I find the matching
Username from arrOne or is there some other quicker method to jump right to the
matching Username in arrTwo?
3) Is there a way to quickly merge (join) these two arrays together so then I
can ForEach once through a single array and just compare individual objects
from the same element?
ধন্যবাদ
আপডেট :
আমরা আমাদের স্থানীয় সক্রিয় ডিরেক্টরি এবং এমএসএল (মাইক্রোসফ্ট অনলাইন - অফিস 365) অবজেক্টগুলি পরিচালনা করতে সহায়তা করতে এই স্ক্রিপ্টটি ব্যবহার করি। আমরা Office 365 এর সাথে আমাদের এডি সিঙ্ক রাখতে ডিআরসিঙ্ক ব্যবহার করছি read পাঠযোগ্যতার জন্য উপরের উদাহরণগুলিতে নাম পরিবর্তন করা হলেও অ্যারে ডেটা সংগ্রহ করার জন্য এগুলি ব্যবহৃত প্রাথমিক আদেশগুলি:
[array]$arrOne = @(Get-ADObject -Filter {(objectClass -eq "User") -And (objectCategory -eq "Person")} -SearchBase “OU=Test,DC=domain,DC=com” -Properties UserPrincipalName,physicalDeliveryOfficeName) | Select-Object UserPrincipalName, physicalDeliveryOfficeName
[array]$arrTwo = @(Get-MsolUser -Synchronized -All) | Where-Object {$_.isLicensed -eq "True"} | Select-Object UserPrincipalName, UsageLocation
অ্যারেগুলি বিভিন্ন আকারের হয় (আর্টওনটি আক্ষরিকভাবে আরনের আকারের 10 গুণ বেশি)। এ্যারন থেকে কোনও বস্তু আর্ট টুতে উপস্থিত থাকবে এমন কোনও গ্যারান্টি নেই।
আমার মূল পোস্টিং (বিশেষত দ্বিতীয় লুপটি থেকে বেরিয়ে আসার জন্য BREAK ব্যবহার করে) এই সমস্যাটি সমাধান করার জন্য আমি আরও কয়েকটি বিষয় চেষ্টা করেছি। আসল পোস্টের পরে, আমি বুঝতে পেরেছিলাম যে কোনও ম্যাচ পাওয়া গেলে আমি দ্বিতীয় ফোয়ার-অবজেক্ট লুপটি থেকে "ব্রেক" করতে পারলে আমি সেরা পারফরম্যান্সের উন্নতি পেতে পারি। একটি জিনিস যা জিনিসগুলিকে মন্থর করে দিচ্ছে তা হ'ল পাওয়ারশেল একটি মিল খুঁজে পাওয়ার পরেও আর্ট টুতে লুপিং চালিয়ে যায়। একটি ম্যাচ সন্ধানের পরে আমি বিরতি যুক্ত করার চেষ্টা করেছি তবে আর্ট টু লুপটি বের হয়ে আরোন সংগ্রহে পরবর্তী বস্তুতে ফিরে আসতে পারছি না। এটি সম্পূর্ণ স্ক্রিপ্টটি ভঙ্গ করে (শেষ করে)।
$arrTwo | ForEach-Object {
If ($_.Username -eq $strOneName -eq $True)
{
If ($_.Location -eq $strOneLocalOffice -ne $True)
{
## Take action here if they don't match
write-host $_.Username
}
Break
}
}
আমি বিরতি, বিরতি / চালিয়ে যাওয়া, ব্রেক / লেবেল, ফোরচ-অবজেক্টের পরিবর্তে ফোরচ ব্যবহার করে / করার সময় এবং আরও কিছু চেষ্টা করেছি। এখনও ভাগ্য নেই।
একটি অতিরিক্ত প্রশ্ন:
4) Can break be used to exit a ForEach-Object loop and return it to the “parent”
ForEach-Object?
আবার ধন্যবাদ