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

ทำความเข้าใจกับการเชื่อมโยงพารามิเตอร์ไปป์ไลน์ของ PowerShell


การเขียนบทความนี้ควรช่วยให้คุณมีความเข้าใจพื้นฐานเกี่ยวกับวิธีการประมวลผลออบเจ็กต์ไปป์ไลน์ เทคนิคการวางท่อช่วยให้สามารถเชื่อมต่อระหว่างคำสั่งได้ การวางท่อเป็นเทคโนโลยีสำคัญใน PowerShell ในบล็อกโพสต์นี้ ฉันจะดูการเชื่อมโยงพารามิเตอร์ที่ "ด้านขวา" ของไปป์ ในการดำเนินการนี้ ฉันจะใช้ cmdlet Trace-Command เพื่อสำรวจว่าเกิดอะไรขึ้นเมื่อวัตถุส่งผ่านไปป์จากด้านซ้ายไปทางด้านขวา กระโดดเข้าไปเลย

การแนะนำ

ก่อนอื่น ฉันจะให้ภาพรวมโดยย่อว่าเกิดอะไรขึ้นเมื่อคุณใช้การวางท่อ ฉันได้เตรียมรูปภาพที่แสดงกลไกของไปป์ใน PowerShell

คำถามตอนนี้คือพารามิเตอร์ใดของ Stop-Process ที่เป็นวัตถุของไปป์ที่ถูกผูกไว้ เรามาตรวจสอบว่าพารามิเตอร์ใดรองรับอินพุตไปป์ไลน์ เราสามารถคิดออกได้อย่างง่ายดายด้วย Get-Help


Get-Help Stop-Process -Parameter * | Where-Object pipelineinput -Like 'true*'

ทำความเข้าใจกับการเชื่อมโยงไปป์ไลน์ของ PowerShell

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

ตัวอย่างเช่น InputObject คาดหวังและยอมรับเฉพาะออบเจ็กต์การประมวลผลเท่านั้น


Get-Help Stop-Process -Parameter InputObject

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

การพิสูจน์ว่าสิ่งนี้เกิดขึ้นจริงนั้นมาจาก Trace-Command cmdlet


Trace-Command -Name ParameterBinding -Expression {Get-Process notepad | Stop-Process} -PSHost

ดี. วัตถุทางด้านซ้ายของไปป์ถูกผูกไว้กับพารามิเตอร์ InputObject

ต่อไปเรามาดูกันว่าเกิดอะไรขึ้นเมื่อวัตถุที่ผ่านไปป์ไม่ใช่วัตถุกระบวนการ …

ข้อความแสดงข้อผิดพลาดแจ้งว่า...

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

เฮ้ นั่นมันผิด! จริงๆ แล้ว เรามี 3 พารามิเตอร์ที่ยอมรับอินพุตไปป์ไลน์ … เกิดอะไรขึ้นที่นี่

จำไว้ว่าเรามีพารามิเตอร์สามตัว ไม่มีใครสามารถประมวลผลวัตถุไปป์ไลน์ 'แผ่นจดบันทึก' ได้ และตอนนี้เราจะดูว่าทำไม เพื่อความกระจ่าง ให้ฉันแสดงประเภทวัตถุของ 'notepad' ให้คุณดู:

Notepad เป็นสตริง

เหนือสิ่งอื่นใด PowerShell พยายามผูกอาร์กิวเมนต์กับพารามิเตอร์ Name อย่างไรก็ตาม พารามิเตอร์ชื่อยอมรับเฉพาะสตริงของออบเจ็กต์ ชื่อ เท่านั้น 'notepad' ไม่ใช่วัตถุชื่อ ภาพด้านล่างแสดงให้เห็นว่าเป็นไปตามที่ผมพยากรณ์ไว้ว่าจะเป็นเช่นนั้น Powershell จะไม่พยายามผูกสตริงกับพารามิเตอร์ Name หรือพารามิเตอร์ id


Trace-Command -Name ParameterBinding -Expression {'notepad' | Stop-Process} -PSHost

ตอนนี้เราจะทำให้ PowerShell ยอมรับสมุดบันทึกสตริง (PSCostumObject) ได้อย่างไร คำตอบคือเราต้องทำให้ Notepad เป็นวัตถุชื่อ


$a=Get-Process -Name notepad | Select-Object -Property Name

สังเกตความแตกต่างระหว่างวัตถุแผ่นจดบันทึกปัจจุบันและวัตถุแผ่นจดบันทึกก่อนหน้า

ดี. ชื่อคุณสมบัติของ Notepad ตรงกับชื่อพารามิเตอร์ "ชื่อ"

ตอนนี้เราสามารถไปป์วัตถุไปที่ Stop-Process


$a | Stop-Process

ด้วย Trace-Command เราสามารถตรวจสอบอีกครั้งว่า PowerShell ทำอะไรไปแล้ว PowerShell ได้ผูกวัตถุไปป์ไลน์เข้ากับพารามิเตอร์ Name เนื่องจากชื่อคุณสมบัติวัตถุไปป์ไลน์ตรงกับชื่อพารามิเตอร์ “ชื่อ”

ฉันหวังว่าฉันจะให้ข้อมูลเชิงลึกที่ดีเกี่ยวกับหัวข้อนี้ แล้วพบกันใหม่ครั้งหน้า!

ลิงค์

https://devblogs.microsoft.com/scripting/learn-about-using-powershell-value-binding-by-property-name/

https://blogs.technet.microsoft.com/askpfeplat/2016/11/21/two-ways-to-accept-pipeline-input-in-powershell/

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