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