ค้นหาเว็บไซต์

เปรียบเทียบอาร์เรย์ใน PowerShell [4 วิธี]


ในบทความนี้ เราจะดูวิธีเปรียบเทียบอาร์เรย์ใน PowerShell

PowerShell รองรับอาร์เรย์ที่มีหนึ่งมิติขึ้นไปและมีองค์ประกอบเป็นศูนย์ถึงหลายองค์ประกอบในแต่ละมิติ องค์ประกอบภายในมิติจะมีหมายเลขตั้งแต่ 0 ตามลำดับจำนวนเต็มจากน้อยไปหามาก นอกจากนี้ ตัวดำเนินการตัวห้อยอาร์เรย์ [] อนุญาตให้เข้าถึงองค์ประกอบเฉพาะใดๆ PowerShell อาจนำไปใช้ได้หลายวิธีเพื่อเปรียบเทียบอาร์เรย์ ต่อไปนี้เป็นบางส่วนของพวกเขา

เปรียบเทียบอาร์เรย์ของสตริง

หากคุณมีอาร์เรย์สองตัวที่มีสตริง เราอาจเปรียบเทียบกับ PowerShell ด้วยวิธีที่ง่ายที่สุดวิธีหนึ่งที่เป็นไปได้ เราสามารถเปรียบเทียบสตริงในอาร์เรย์ได้หลายวิธีเมื่อเราพบว่าตัวเองตกอยู่ในสถานการณ์นี้ ด้านล่างนี้เป็นวิธีการบางส่วนในการเปรียบเทียบอาร์เรย์ของสตริง

  • ใช้ Where-Object Cmdlet พร้อมด้วยตัวดำเนินการ
  • ใช้ Compare-Object Cmdlet
  • การใช้ตัวดำเนินการ -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

บทความที่เกี่ยวข้อง