ทำความเข้าใจกับการเชื่อมโยงพารามิเตอร์ไปป์ไลน์ของ 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/











