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

อาร์เรย์ PowerShell ประกอบด้วยคำอธิบาย


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

หากต้องการตรวจสอบว่ามีค่าอยู่ในอาร์เรย์หรือไม่ เราสามารถใช้ตัวดำเนินการ -Contains ใน PowerShell สิ่งนี้จะส่งคืนค่าจริงหากมีค่าอยู่ แต่มีตัวเลือกอื่นเช่นกัน

ในบทความนี้ ฉันจะแสดงวิธีที่คุณสามารถตรวจสอบได้ว่า อาร์เรย์ PowerShell มีค่า เฉพาะเจาะจงหรือไม่ และอธิบายวิธีการต่างๆ

อาร์เรย์ PowerShell ประกอบด้วย

วิธีที่แนะนำในการตรวจสอบว่าอาร์เรย์มีค่าเฉพาะหรือไม่คือการใช้ตัวดำเนินการ -contains หรือเมธอด .Contains() ใน PowerShell แม้ว่าทั้งสองจะดูคล้ายกัน แต่ก็มีความแตกต่างที่สำคัญระหว่างทั้งสอง

ขั้นแรก มาดูวิธีใช้โอเปอเรเตอร์ -contains กันก่อน หากต้องการตรวจสอบว่าสตริงอยู่ในอาร์เรย์หรือไม่ คุณสามารถทำสิ่งต่อไปนี้:

$array = @('apple', 'banana', 'cherry')

if ($array -contains 'banana') {
    Write-Host "Array contains banana"
}else{
    Write-Host "Banana not found in the array"
}

วิธีการข้างต้นจะตรวจสอบว่ามีสตริงอยู่ในอาร์เรย์หรือไม่ การเปรียบเทียบไม่คำนึงถึงขนาดตัวพิมพ์ และผู้ปฏิบัติงานจะหยุดเมื่อพบผลลัพธ์ ดังนั้นเมื่อรายการ ซึ่งเป็นผลไม้ในตัวอย่างข้างต้น ถูกแสดงรายการหลายครั้งในอาร์เรย์ รายการนั้นจะยังคงส่งกลับค่าเป็น True หรือ False

ดังนั้นจึงมีตัวเลือกอื่นๆ สองสามตัวเลือกในการตรวจสอบว่าค่าแสดงอยู่ในอาร์เรย์หรือไม่ นอกจากวิธี .Contains() แล้ว เรายังสามารถใช้:

  • ตัวดำเนินการในตัว - ตรวจสอบว่าค่าอยู่ในอาร์เรย์หรือไม่ ซึ่งเป็นอีกวิธีในการเขียน
  • -ccontains ตัวดำเนินการ - การเปรียบเทียบแบบคำนึงถึงขนาดตัวพิมพ์
  • -eq - สามารถตรวจสอบว่าอาร์เรย์มีค่าเฉพาะหรือไม่
  • ที่ไหน-วัตถุ - ช่วยให้คุณสามารถทำการเปรียบเทียบที่ซับซ้อนมากขึ้น

ตรวจสอบให้แน่ใจว่าคุณได้อ่านบทความตัวดำเนินการ PowerShell ด้วยหากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกต่างๆ

ประกอบด้วยตัวดำเนินการเทียบกับวิธีการบรรจุ

ดังนั้นก่อนอื่นฉันอยากจะอธิบายความแตกต่างระหว่างตัวดำเนินการบรรจุกับวิธีการบรรจุก่อน เพราะมันดูคล้ายกันมาก แต่ก็มีอะไรที่มากกว่านั้น

วิธีการ ประกอบด้วย ซึ่งเขียนว่า .contains() เป็นวิธีการจากเฟรมเวิร์ก .NET พื้นฐาน ในขณะที่ตัวดำเนินการนั้นเฉพาะกับ PowerShell ตอนนี้วิธี .NET ทำงานเร็วขึ้น ดังนั้นเมื่อคุณต้องการค้นหาค่าในอาเรย์ขนาดใหญ่ ก็จะมีประโยชน์อย่างแท้จริง

ข้อแตกต่างที่สำคัญอีกประการระหว่างทั้งสองคือเมธอด contains คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่โดยค่าเริ่มต้น ในขณะที่ตัวดำเนินการไม่:

$array = @('apple', 'banana', 'cherry', 'banana')

$array -contains 'Banana' # Returns true
$array.Contains('Banana') # Returns false

ประกอบด้วยโดยคำนึงถึงขนาดตัวพิมพ์

ตามที่กล่าวไว้ ตัวดำเนินการ contains คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ซึ่งมักจะใช้ได้อย่างสมบูรณ์แบบ แต่เมื่อคุณสามารถจับคู่ค่าตัวพิมพ์ทุกประการได้โดยใช้ตัวดำเนินการ -ccontains (โปรดสังเกต double c)

$array = @('apple', 'banana', 'cherry', 'banana')

# Case sensitive comparison
$array -ccontains 'Banana' # Returns false

อาร์เรย์ไม่มี

แทนที่จะตรวจสอบว่าอาร์เรย์มีค่าเฉพาะหรือไม่ เรายังสามารถตรวจสอบได้ว่าอาร์เรย์ไม่มีค่าที่ระบุอีกด้วย ในการดำเนินการนี้ เราสามารถใช้ตัวดำเนินการ -notcontains ตัวดำเนินการจะส่งคืนค่า True หากค่าไม่อยู่ในอาร์เรย์

ตัวอย่างเช่น เรามีรายชื่อผู้ใช้ที่สำเร็จการศึกษาการฝึกอบรมด้านความปลอดภัย และเราต้องการตรวจสอบว่าผู้ใช้รายใด ยังไม่ ผ่านการฝึกอบรมดังกล่าว ในกรณีนี้ -notcontains เป็นตัวเลือกที่สมเหตุสมผลกว่าในการใช้งาน:

# List of users
$completedTraining = @('John', 'Alice', 'Robert', 'Sarah')

# Check if the user has not completed the training
if ($completedTraining -notcontains 'Jane'){
    Write-Host "Jane didn't completed the training"
}

การใช้ตัวดำเนินการ -In

ตัวดำเนินการ -in เหมือนกับตัวดำเนินการบรรจุ แต่จะกลับกันเท่านั้น นอกจากนี้ยังคืนค่าเป็นจริงเมื่อค่าอยู่ในอาร์เรย์ ข้อแตกต่างเพียงอย่างเดียวคือคุณวางอาร์เรย์ไว้ทางด้านขวาของตัวดำเนินการ แทนที่จะเป็นด้านซ้าย

คุณควรใช้ตัวดำเนินการ -in เมื่อใช้งานง่ายและกระชับกับสถานการณ์ ตัวอย่างเช่น หากเราต้องการตรวจสอบว่าผู้ใช้เป็นสมาชิกของกลุ่มผู้ดูแลระบบหรือไม่ ก็ควรตรวจสอบว่า "เจน" อยู่ในกลุ่มผู้ดูแลระบบหรือไม่ มากกว่าที่จะตรวจสอบว่ากลุ่มผู้ดูแลระบบมี "เจน" หรือไม่:

# List of admin users
$adminUsers = @('John', 'Alice', 'Robert')

# Using the -in operator
if ('Alice' -in $adminUsers) {
    Write-Output "Alice is an admin."
}

สิ่งสำคัญที่นี่คือการทำให้โค้ดของคุณอ่านและทำความเข้าใจได้ง่ายขึ้น คุณยังสามารถใช้ตัวดำเนินการ -notin ซึ่งจะตรวจสอบว่าค่าไม่อยู่ในอาร์เรย์หรือไม่

ผู้ประกอบการที่เท่าเทียมกัน

คุณอาจไม่คาดคิด แต่เรายังสามารถใช้ตัวดำเนินการ -eq เพื่อตรวจสอบว่าอาร์เรย์มีค่าเฉพาะใน PowerShell หรือไม่ ความแตกต่างอย่างมากกับตัวดำเนินการ -contains อย่างไรก็ตาม ตัวดำเนินการที่เท่ากันจะไม่ส่งคืนค่าจริงหรือเท็จ แต่จะส่งคืนค่า

และที่สำคัญกว่านั้นคือไม่หยุดค้นหาค่าเมื่อพบค่าแล้ว ซึ่งหมายความว่าเราสามารถนับหรือตรวจสอบว่าค่าถูกแสดงหลายครั้งในอาร์เรย์หรือไม่:

$array = @('apple', 'banana', 'cherry', 'banana')

$result = $array -eq "banana"

if ($result) {
    Write-Host "Banana is listed $($result.Length) time(s) in the array"
}

# Result
Banana is listed 2 time(s) in the array

การใช้ Where-Object

ตัวเลือกสุดท้ายที่ฉันต้องการแสดงให้คุณเห็นคือวิธี Where-Object เพื่อตรวจสอบว่าอาร์เรย์มีค่าเฉพาะหรือไม่ วิธีการนี้ส่วนใหญ่จะใช้เมื่อคุณมีอาร์เรย์ของออบเจ็กต์หรือจำเป็นต้องทำการเปรียบเทียบที่ซับซ้อนอื่นๆ

ตัวอย่างเช่น เรามีอาร์เรย์ที่มีอ็อบเจ็กต์ผู้ใช้ และต้องการตรวจสอบว่าอาร์เรย์มีผู้ใช้เฉพาะหรือไม่:

$users = @(
    [PSCustomObject]@{ Name = 'John'; Age = 30 },
    [PSCustomObject]@{ Name = 'Jane'; Age = 25 },
    [PSCustomObject]@{ Name = 'Alice'; Age = 28 }
)

$result = $users | Where-Object { $_.Name -contains 'Jane'}

ห่อขึ้น

วิธีทั่วไปในการตรวจสอบว่าอาร์เรย์มีค่าเฉพาะหรือไม่คือการใช้ตัวดำเนินการ -contains โปรดทราบว่านี่เป็นกรณีคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ในขณะที่เมธอด .contains() คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

พยายามใช้โอเปอเรเตอร์ที่เหมาะสมกับสถานการณ์ ซึ่งจะทำให้โค้ดของคุณอ่านและเข้าใจได้ง่ายขึ้น

หวังว่าคุณจะชอบบทความนี้ หากคุณมีคำถามใด ๆ เพียงแสดงความคิดเห็นด้านล่าง