เปรียบเทียบอาร์เรย์ใน PowerShell [4 วิธี]
ในบทความนี้ เราจะดูวิธีเปรียบเทียบอาร์เรย์ใน PowerShell
PowerShell รองรับอาร์เรย์ที่มีหนึ่งมิติขึ้นไปและมีองค์ประกอบเป็นศูนย์ถึงหลายองค์ประกอบในแต่ละมิติ องค์ประกอบภายในมิติจะมีหมายเลขตั้งแต่ 0 ตามลำดับจำนวนเต็มจากน้อยไปหามาก นอกจากนี้ ตัวดำเนินการตัวห้อยอาร์เรย์ [] อนุญาตให้เข้าถึงองค์ประกอบเฉพาะใดๆ PowerShell อาจนำไปใช้ได้หลายวิธีเพื่อเปรียบเทียบอาร์เรย์ ต่อไปนี้เป็นบางส่วนของพวกเขา
เปรียบเทียบอาร์เรย์ของสตริง
หากคุณมีอาร์เรย์สองตัวที่มีสตริง เราอาจเปรียบเทียบกับ PowerShell ด้วยวิธีที่ง่ายที่สุดวิธีหนึ่งที่เป็นไปได้ เราสามารถเปรียบเทียบสตริงในอาร์เรย์ได้หลายวิธีเมื่อเราพบว่าตัวเองตกอยู่ในสถานการณ์นี้ ด้านล่างนี้เป็นวิธีการบางส่วนในการเปรียบเทียบอาร์เรย์ของสตริง
- ใช้
Where-ObjectCmdlet พร้อมด้วยตัวดำเนินการ - ใช้
Compare-ObjectCmdlet - การใช้ตัวดำเนินการ
-contains - การใช้ตัวดำเนินการ
-in
ใช้ Where-Object Cmdlet พร้อมด้วยตัวดำเนินการ
ใช้ Where-Object cmdlet เพื่อเปรียบเทียบอาร์เรย์ใน PowerShell
ใช้ Where-Object Cmdlet:
$array1 = "Monday", "Tuesday", "Wednesday", "Thursday"
$array2 = "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
$array1 | Where-Object -FilterScript { $_ -in $array2 }เอาท์พุท :
Wednesday
Thursdayวัตถุประสงค์เพียงอย่างเดียวของ PowerShell Where-Object cmdlet คือการกรองเอาต์พุตของคำสั่งเพื่อให้ส่งคืนเฉพาะข้อมูลที่คุณต้องการเท่านั้น บล็อกสคริปต์เป็นฟังก์ชันที่ไม่ระบุชื่อ ดังนั้น คุณจะต้องใช้พารามิเตอร์ -FilterScript เพื่อจ้างบล็อกสคริปต์เป็นตัวกรอง พารามิเตอร์นี้ช่วยให้คุณสามารถเขียนบล็อกสคริปต์ ซึ่งสามารถส่งผ่านไปยัง FilterScript และดำเนินการใน where- object cmdlet
ตัวดำเนินการ -in หมายความว่าค่าอยู่ในคอลเลกชันและส่งคืนค่าคุณสมบัติหากพบรายการที่ตรงกัน ตัวแปรไปป์ไลน์ $_ เป็นตัวแปรเฉพาะใน PowerShell ที่ใช้เพื่อแสดงวัตถุปัจจุบัน ดังนั้นเราจึงได้ผลลัพธ์ วันพุธ และ วันพฤหัสบดี จากทั้งสองอาร์เรย์ที่พบรายการที่ตรงกัน
ใช้ Compare-Object Cmdlet
ใช้ Compare-Object cmdlet เพื่อเปรียบเทียบอาร์เรย์ใน PowerShell cmdlet เปรียบเทียบวัตถุเปรียบเทียบสองชุดของวัตถุ วัตถุชุดหนึ่งคือข้อมูลอ้างอิง และวัตถุอีกชุดหนึ่งคือความแตกต่าง**
ใช้ Compare-Object Cmdlet:
$array1 = "Monday", "Tuesday", "Wednesday", "Thursday"
$array2 = "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
Compare-Object -ReferenceObject $array1 -DifferenceObject $array2เอาท์พุท :
InputObject SideIndicator
----------- -------------
Friday =>
Saturday =>
Sunday =>
Monday <=
Tuesday <=เราใช้ Compare-Object cmdlet ใน PowerShell เพื่อเปรียบเทียบอาร์เรย์ที่ระบุ เมื่อใช้ -ReferenceObject และ DifferenceObject cmdlet นี้สามารถกำหนดได้ว่าองค์ประกอบใดมีอยู่ในแต่ละอาร์เรย์และองค์ประกอบใดที่ไม่มี => เป็นคุณสมบัติ SideIndicator บ่งชี้ว่าคุณสมบัติ InputObject ที่ส่งคืนนั้นอยู่ในค่า DifferenceObject แทนที่จะเป็น ReferenceObject ในขณะที่ค่า <= หมายถึงสิ่งที่ตรงกันข้าม
ใช้ตัวดำเนินการ -Contains
ใช้ตัวดำเนินการ -Contains เพื่อตรวจสอบว่าสตริงที่ระบุเป็นส่วนหนึ่งของอาร์เรย์อื่นใน PowerShell หรือไม่
ใช้ - มีตัวดำเนินการ:
$array = @('potato', 'onion', 'peas', 'carrot')
$array -contains 'onion'
เอาท์พุท :
Trueตัวดำเนินการ -Contains ของ PowerShell ช่วยให้คุณสามารถระบุได้ว่ารายการใดเป็นส่วนหนึ่งของคอลเลกชันหรือไม่ แม้ว่าโอเปอเรเตอร์ -Contains จะไม่เข้าใจคอลเลกชั่นโดยค่าเริ่มต้น แต่คุณสามารถเขียนโค้ดเพื่อให้ทำงานตามที่คุณต้องการได้ PowerShell สามารถใช้ตัวดำเนินการนี้เพื่อตรวจสอบรายการเดียวในอาร์เรย์ จะส่งกลับ True หากมีอยู่ในอาร์เรย์ มิฉะนั้นจะส่งกลับ False
มาสร้างอาร์เรย์สองชุดเพื่อตรวจสอบสตริงคำสั่งของทั้งสองอาร์เรย์
ใช้ - มีตัวดำเนินการ:
$array1 = @('potato', 'onion', 'carrot')
$array2 = @('peas', 'cauliflower', 'potato')
$array1 | ForEach-Object {
if ($array2 -contains $_) {
Write-Host "<code>$array2 has the </code>$array1 string [$_]"
}
}เอาท์พุท :
$array2 has the $array1 string [potato]ForEach-Object cmdlet ทำงานกับทุกรายการในคอลเลกชันของวัตถุอินพุต วัตถุอินพุตยังสามารถไปป์ไปยัง cmdlet หรือระบุโดยใช้พารามิเตอร์ InputObject เราใช้มันเพื่อวนซ้ำบน array1 เราใช้คำสั่ง if พร้อมด้วยตัวดำเนินการ -contains สำหรับการวนซ้ำแต่ละครั้งเพื่อตรวจสอบว่า array2 มีองค์ประกอบนั้นด้วยหรือไม่ หากเป็นเช่นนั้น เราใช้ Write-Host cmdlet เพื่อพิมพ์เอาต์พุตที่กำหนดเอง ดังที่แสดงไว้ด้านบน
ใช้ตัวดำเนินการ -in กับ ForEach-Object
ใช้ตัวดำเนินการ -in เพื่อตรวจสอบว่าสตริงที่ระบุเป็นส่วนหนึ่งของอาร์เรย์อื่นใน PowerShell หรือไม่
ใช้ตัวดำเนินการ -in:
$array1 = @('potato', 'onion', 'carrot')
$array2 = @('peas', 'cauliflower', 'potato')
$array1 | ForEach-Object {
if ($_ -in $array2) {
Write-Host "<code>$array2 has the </code>$array1 string [$_]"
}
}เอาท์พุท :
$array2 has the $array1 string [potato]โค้ดนี้คล้ายกับตัวอย่างก่อนหน้านี้ แต่ใช้ตัวดำเนินการ -in สำหรับโค้ดนี้ ซึ่งเทียบเท่ากับตัวดำเนินการ -contains แต่มีไวยากรณ์ตรงกันข้าม อาร์เรย์ถูกกำหนดไว้ทางด้านซ้ายเมื่อใช้ตัวดำเนินการ -contains คราวนี้ อาร์เรย์จะถูกระบุทางด้านขวาโดยใช้ตัวดำเนินการ -in ดังที่แสดงด้านบน
เปรียบเทียบอาร์เรย์ของวัตถุที่กำหนดเอง
ใช้ Compare-Object เพื่อเปรียบเทียบอาร์เรย์ของออบเจ็กต์ที่กำหนดเอง cmdlet เปรียบเทียบวัตถุเปรียบเทียบสองชุดของวัตถุ วัตถุชุดหนึ่งคือข้อมูลอ้างอิง และวัตถุอีกชุดหนึ่งคือความแตกต่าง
ใช้ Where-Object Cmdlet:
$ArrayObject1 = @(
[PSCustomObject]@{Name = "John"; Age = 30},
[PSCustomObject]@{Name = "Martin"; Age = 25}
)
$ArrayObject2 = @(
[PSCustomObject]@{Name = "John"; Age = 30},
[PSCustomObject]@{Name = "Sam"; Age = 40}
)
Compare-Object -ReferenceObject $ArrayObject1 -DifferenceObject $ArrayObject2 -Property Name, Ageเอาท์พุท :
Name Age SideIndicator
---- --- -------------
Name Age SideIndicator
---- --- -------------
Sam 40 =>
Martin 25 <=โค้ดด้านบนจะทำให้คุณเห็นความแตกต่างระหว่างสองอาร์เรย์
<= แสดงว่าองค์ประกอบนั้นมีอยู่ใน ReferenceObject
=> แสดงว่าองค์ประกอบนั้นมีอยู่ใน DifferenceObject เท่านั้น
นั่นคือทั้งหมดที่เกี่ยวกับวิธีการเปรียบเทียบอาร์เรย์ใน PowerShell
