PowerShell İşlem Hattı Parametre Bağlamasını Anlama


Bu yazı size boru hattı nesnelerinin nasıl işlendiği konusunda temel bir anlayış sunacaktır. Borulama tekniği komutlar arasında bir tür bağlantıya izin verir. Borulama, PowerShell'de önemli bir teknolojidir. Bu blog yazısında borunun "sağ tarafındaki" parametre bağlamaya bir göz atacağım. Bunu yapmak için Trace-Command cmdlet'ini kullanarak bir nesne borunun sol tarafından sağ tarafına geçerken neler olduğunu araştıracağım. Hadi içeri girelim.

giriiş

Her şeyden önce, boruları kullandığınızda neler olduğuna dair size hızlı bir genel bakış sunacağım. PowerShell'de borunun mekanizmasını gösteren bir resim hazırladım.

Şimdi soru, borunun nesnesinin Durdurma Sürecinin hangi parametresine bağlı olduğudur? Hangi parametrelerin işlem hattı girişini desteklediğini inceleyelim. Get-Help ile bunu kolayca çözebiliriz.


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

PowerShell Pipeline Bağlamayı Anlama

Öncelikle PowerShell'in işlem hattı nesnelerini nasıl bağladığının en belirgin yolunu inceleyelim. PowerShell, kanalın sol tarafından gelen nesneleri alır ve ardından bu nesneleri, süreç nesnelerini kabul eden bir parametreye bağlar.

Örneğin, InputObject yalnızca işlem nesnelerini bekler ve kabul eder.


Get-Help Stop-Process -Parameter InputObject

Bu, süreç nesnelerinin beklendiği ve bu nesneyi borunun sol tarafında sağlamamız gerektiği anlamına gelir. PowerShell daha sonra işlem nesnesini InputObject by value parametresine bağlayacaktır. Aşağıdaki ekran eylemi göstermektedir.

Bunun gerçekten gerçekleştiğinin kanıtı Trace-Command cmdlet'i tarafından sağlanmaktadır.


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

Güzel. Kanalın sol tarafındaki nesne, OutputObject parametresine bağlandı.

Şimdi borudan geçen nesne bir süreç nesnesi olmadığında neler olduğuna bir bakalım…

Hata mesajı diyor ki…

Komut ardışık düzen girdisi almadığından ya da girdi ve özellikleri ardışık düzen girdisi alan parametrelerin hiçbiriyle eşleşmediğinden, giriş nesnesi komuta ilişkin herhangi bir parametreye bağlanamaz.

Hey, bu yanlış! Aslında boru hattı girişini kabul eden 3 parametremiz var… Neler oluyor burada?

Unutmayın, üç parametremiz var. Hiçbiri boru hattı nesnesi 'notepad'i işleyemeyecek ve şimdi nedenini göreceğiz. Açıklığa kavuşturmak için size 'not defteri'nin nesne türünü göstereyim:

Not Defteri bir String'dir.

PowerShell, diğer şeylerin yanı sıra bağımsız değişkeni Name parametresine bağlamaya çalışır. Ancak Ad Parametresi yalnızca Ad nesnelerinin dizelerini kabul eder. 'not defteri' bir Ad Nesnesi değildir. Aşağıdaki resim bunun olacağını tahmin ettiğim gibi olduğunu gösteriyor. Powershell, dizeyi Name parametresine veya id parametresine bağlamaya çalışmaz.


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

Artık PowerShell'in (PSCostumObject) not defteri dizesini kabul etmesini nasıl sağlayabiliriz? Cevap, Not Defteri'ni bir Ad nesnesi yapmamız gerektiğidir.


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

Geçerli not defteri nesnesi ile önceki not defteri nesnesi arasındaki farka dikkat edin.

İyi. Not Defteri'nin özellik adı artık "Ad" parametre adıyla eşleşiyor.

Artık nesneyi Stop-Process'e yönlendirebiliriz.


$a | Stop-Process

Trace-Command ile PowerShell'in ne yaptığını tekrar kontrol edebiliriz. Ardışık düzen nesnesi özelliği adı "Ad" parametre adıyla eşleştiğinden, PowerShell ardışık düzen nesnesini Ad parametresine bağlamıştır.

Umarım konuya dair iyi bir fikir verebilirim ve bir dahaki sefere görüşürüz!

Bağlantılar

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/

İlgili makaleler