ส่งผ่านข้อมูลโดยใช้ ByPropertyName

เสร็จสมบูรณ์เมื่อ

หาก Windows PowerShell ไม่สามารถผูกข้อมูลป้อนเข้าไปป์ไลน์โดยใช้เทคนิค ByValue จะพยายามใช้เทคนิค ByPropertyName เมื่อ Windows PowerShell ใช้เทคนิค ByPropertyName จะพยายามจับคู่คุณสมบัติของวัตถุที่ส่งผ่านไปยังพารามิเตอร์ของคําสั่งที่วัตถุถูกส่งผ่าน การจับคู่นี้เกิดขึ้นในลักษณะง่ายๆ ถ้าวัตถุป้อนเข้ามีคุณสมบัติ Name วัตถุดังกล่าวจะถูกจับคู่กับ ชื่อ พารามิเตอร์เนื่องจากสะกดเหมือนกัน อย่างไรก็ตาม การดําเนินการนี้จะส่งผ่านคุณสมบัติก็ต่อเมื่อมีการเขียนโปรแกรมพารามิเตอร์ให้ยอมรับค่าตามชื่อคุณสมบัติ ซึ่งหมายความว่าคุณสามารถส่งผ่านผลลัพธ์จากคําสั่งหนึ่งไปยังอีกคําสั่งหนึ่งเมื่อไม่ได้ทํางานร่วมกันอย่างมีตรรกะ

เช่น:

Get-LocalUser | Stop-Process

คําสั่งแรกจะวางออบเจ็กต์ของชนิด LocalUser ลงในไปป์ไลน์ คําสั่งที่สองไม่มีพารามิเตอร์ที่สามารถยอมรับวัตถุชนิดนั้นได้ คําสั่งที่สองยังไม่มีพารามิเตอร์ที่ยอมรับออบเจ็กต์ทั่วไปหรือ PSObject ดังนั้น เทคนิค ByValue จึงล้มเหลว

เนื่องจากเทคนิค ByValue ล้มเหลว Windows PowerShell จึงเปลี่ยนเป็นเทคนิค ByPropertyName หากต้องการคาดการณ์ว่าจะพยายามทําอะไร คุณสามารถตรวจสอบคุณสมบัติของออบเจ็กต์ที่คําสั่งแรกสร้างได้ ในตัวอย่างนี้ ให้เรียกใช้คําสั่งต่อไปนี้:

Get-LocalUser | Get-Member

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

Get-Help Stop-Process -ShowWindow

โดยทํารายการนี้ คุณจะเห็นว่าคําสั่ง Stop-Process มีพารามิเตอร์มากกว่าหนึ่งตัวที่ยอมรับการป้อนข้อมูลไปป์ไลน์โดยใช้ ByPropertyName พารามิเตอร์เหล่านั้นคือ –ชื่อและ –Id ออบเจ็กต์ที่ Get-LocalUser สร้างไม่มีคุณสมบัติ ID ดังนั้นจึงไม่พิจารณาพารามิเตอร์ –Id วัตถุที่ Get-LocalUser สร้างมีคุณสมบัติ Name ดังนั้น เนื้อหาของคุณสมบัติ Name จะแนบกับพารามิเตอร์ –Name ของ Stop-Service ซึ่งหมายความว่า Stop-Service จะพยายามหยุดบริการที่มีชื่อเหมือนกับผู้ใช้ หากคุณลองใช้ขั้นตอนนี้ใน Windows PowerShell คุณจะสังเกตเห็นข้อผิดพลาดที่คุณได้รับเนื่องจากไม่พบกระบวนการที่มีชื่อเป้าหมาย อย่างไรก็ตาม คุณไม่ต้องการทําขั้นตอนนี้ในสถานการณ์จริง

การเปลี่ยนชื่อคุณสมบัติ

บ่อยครั้งที่ชื่อคุณสมบัติจากวัตถุผลลัพธ์ไม่ตรงกับชื่อของพารามิเตอร์การป้อนข้อมูลอย่างแน่นอน คุณสามารถเปลี่ยนชื่อของคุณสมบัติโดยใช้ Select-Object และสร้างคุณสมบัติจากการคํานวณได้ ตัวอย่างเช่น เมื่อต้องดูกระบวนการที่เรียกใช้บนคอมพิวเตอร์ทั้งหมดใน Windows Server Active Directory ของคุณ ลองเรียกใช้คําสั่งต่อไปนี้:

Get-ADComputer -Filter * | Get-Process

อย่างไรก็ตาม คําสั่งนี้ใช้ไม่ได้ ไม่มีพารามิเตอร์สําหรับ Get-Process ที่ตรงกับชื่อคุณสมบัติสําหรับผลลัพธ์ของ Get-ADComputer ดูผลลัพธ์ของ Get-ADComputer | ดูผลลัพธ์ของ Get-ADComputer Get-Member และ Get-Help Get-Process คุณจะเห็นว่าสิ่งที่คุณต้องการคือการจับคู่คุณสมบัติ Name ของ Get-ADComputer กับพารามิเตอร์ -ComputerName ของ Get-Process คุณสามารถทําได้โดยใช้ Select-Object และเปลี่ยนชื่อคุณสมบัติสําหรับคุณสมบัติ Get-ADComputer command's Name ไปยัง ComputerName แล้วส่งผลลัพธ์ไปยัง Get-Process คําสั่งต่อไปนี้จะทํางาน:

Get-ADComputer -Filter * | Select-Object @{n='ComputerName';e={$PSItem.Name}} | Get-Process

อีกการใช้งานทั่วไปของเทคนิค ByPropertyName คือ เมื่อคุณนําเข้าข้อมูลจากค่าที่คั่นด้วยเครื่องหมายจุลภาค (CSV) หรือไฟล์ที่คล้ายกัน และคุณดึงข้อมูลนั้นไปยังคําสั่งเพื่อให้คุณสามารถประมวลผลรายการเฉพาะของผู้ใช้ คอมพิวเตอร์ หรือทรัพยากรอื่นๆ