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

PowerShell โดยที่วัตถุไม่ตรงกัน [พร้อมตัวอย่าง]


PowerShell Where-Object cmdlet ช่วยให้ผู้ใช้สามารถกรองออบเจ็กต์ตามคุณสมบัติและค่าได้ ในบทช่วยสอน PowerShell นี้ เราจะเจาะลึกพารามิเตอร์ -NotMatch ของ cmdlet Where-Object ใน PowerShell และวิธีที่พารามิเตอร์สามารถกรองออบเจ็กต์ที่ไม่ตรงกับที่ระบุ ลวดลาย.

PowerShell โดยที่วัตถุไม่ตรงกัน

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

ตัวดำเนินการ -NotMatch

ใน PowerShell -match และ -notmatch คือตัวดำเนินการที่ใช้กับนิพจน์ทั่วไป (regex) เพื่อจับคู่สตริงกับรูปแบบ โอเปอเรเตอร์ -match ส่งคืน true เมื่ออินพุตตรงกับรูปแบบ regex ในขณะที่ -notmatch ส่งคืน true เมื่ออินพุต ไม่ตรงกับรูปแบบ

ตัวอย่างเช่น หากคุณต้องการกรองรายการชื่อไฟล์เพื่อยกเว้นชื่อที่ลงท้ายด้วย .log คุณสามารถใช้ -notmatch กับ Where-Object cmdlet ดังนี้:

Get-ChildItem | Where-Object { $_.Name -notmatch '\.log$' }

คำสั่งนี้จะรับรายการทั้งหมดในไดเร็กทอรีปัจจุบัน แต่จะส่งผ่านเฉพาะรายการที่มีชื่อไม่ได้ลงท้ายด้วย .log เท่านั้น

PowerShell โดยที่วัตถุไม่ตรงกับตัวอย่าง

มาดูตัวอย่างการใช้งานจริงของการใช้ Where-Object กับตัวดำเนินการ -NotMatch ใน PowerShell

ตัวอย่างที่ 1: กระบวนการกรอง

สมมติว่าคุณต้องการรับรายการกระบวนการที่ทำงานอยู่ทั้งหมดที่ไม่ใช่อินสแตนซ์ของ Chrome:

Get-Process | Where-Object { $_.ProcessName -notmatch 'chrome' }

คำสั่งนี้ส่งคืนกระบวนการทั้งหมดที่ชื่อกระบวนการไม่ตรงกับ "chrome"

คุณสามารถดูผลลัพธ์ได้ในภาพหน้าจอด้านล่าง:

ตัวอย่างที่ 2: การยกเว้นข้อความเฉพาะจากเนื้อหา

ลองนึกภาพคุณมีไฟล์ข้อความที่มีหลายบรรทัด และคุณต้องการอ่านบรรทัดที่ไม่มีคำว่า “ข้อผิดพลาด”:

Get-Content .\logfile.txt | Where-Object { $_ -notmatch 'error' }

คำสั่งนี้อ่าน 'logfile.txt' และส่งออกบรรทัดที่ไม่มี "ข้อผิดพลาด"

ตัวอย่างที่ 3: การกรองออบเจ็กต์ที่มีหลายเงื่อนไข

คุณยังรวม -notmatch กับโอเปอเรเตอร์อื่นๆ เพื่อสร้างตัวกรองที่ซับซ้อนมากขึ้นได้ด้วย ตัวอย่างเช่น หากคุณต้องการกรองบริการที่หยุดทำงานและชื่อไม่ตรงกับ "win" ออก:

Get-Service | Where-Object { $_.Status -ne 'Running' -and $_.Name -notmatch 'win' }

คำสั่งนี้จะกรองบริการที่ไม่ได้ทำงานอยู่และชื่อไม่มีคำว่า "win"

เมื่อใช้ PowerShell -NotMatch ใน Where-Object สิ่งสำคัญคือต้องปฏิบัติตามแนวทางปฏิบัติแนะนำบางประการ:

  1. การพิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่: ตามค่าเริ่มต้น -match และ -notmatch จะไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ใน PowerShell หากต้องการคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ คุณสามารถใช้คำนำหน้า c ได้ดังเช่นใน -cnotmatch
  2. ประสิทธิภาพ: การกรองด้วย Where-Object อาจทำงานได้ช้าในคอลเล็กชันขนาดใหญ่ เมื่อเป็นไปได้ ให้ใช้พารามิเตอร์การกรองเฉพาะ cmdlet ซึ่งโดยปกติจะมีประสิทธิภาพมากกว่า
  3. รูปแบบที่ซับซ้อน: สำหรับรูปแบบที่ซับซ้อน ให้พิจารณาจัดเก็บ regex ไว้ในตัวแปรเพื่อให้อ่านง่าย:
$pattern = 'error|warning|critical'
Get-Content .\logfile.txt | Where-Object { $_ -notmatch $pattern }
  1. การทดสอบ: ทดสอบรูปแบบ regex ของคุณด้วยข้อมูลตัวอย่างเสมอ เพื่อให้แน่ใจว่าทำงานตามที่คาดไว้ก่อนที่จะเรียกใช้ในสคริปต์
  2. การ Escape: อย่าลืมใช้ Escape อักขระ regex พิเศษ เมื่อคุณต้องการจับคู่อักขระเหล่านั้นตามตัวอักษร

บทสรุป

cmdlet Where-Object ของ PowerShell พร้อมด้วยตัวดำเนินการ -NotMatch มีประโยชน์อย่างมากในการกรองออบเจ็กต์ที่ไม่ตรงกับรูปแบบเฉพาะ ในบทช่วยสอน PowerShell นี้ ฉันได้อธิบายทุกอย่างเกี่ยวกับ PowerShell โดยที่วัตถุไม่ตรงกัน พร้อมตัวอย่าง

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