PowerShell'de Parametre Bağlama kavramları


style="letter-spacing: 0px; text-transform: unset; arka plan rengi: şeffaf;">Parametre bağlama, PowerShell'de temel bir kavramdır. Ve eğer bunu yaparsanız bir süreliğine başınızı kaşıyabilirsiniz. yakın zamanda ilk elden deneyimlediğim için bu kavramı tam olarak anlayamıyorum.

Benim durumumda bu, gelişmiş işlevlerin basit bir yeniden okunmasıydı ve daha sonra ne kadarını hatırlayabildiğimi yeniden test etmek için hesap makinesi yapmak için basit bir komut dosyası denedim. Sorun, boru hattından parametre değerlerini sağlamaya çalıştığımda başladı. Bu blog yazısında iki temel PowerShell ardışık düzen parametre bağlama kavramının üzerinden geçeceğim: “byValue ” ve “ byProperty ”.

Bırakalım hesap makinesi programımdaki ilk denememi inceleyin. Aşağıda görebileceğiniz gibi bu a iki sayıyı toplamak, çıkarmak, çarpmak ve bölmek için basit PowerShell betiği (Şekil 1a + 1b).

Şekil 1a: Basit Hesap Makinesi Bölüm 1. Fonksiyonun Adı: Get-Hesaplama; Üç Parametre: $firstNumber, $secondNumber ve $operator. Parametre Nitelikleri: Zorunlu ve Pipeline'dan değer kabul et. Operatör parametresinin sabit bir değer kümesi vardır.

Şekil 1b: Basit Hesap Makinesi Bölüm 2. Çıkış nesnesinin tanımlanması ve çıkış nesnesinin işlem hattına yazılması.

Sorun burada başlıyor: İşlev parametrelerimle aynı özelliklere sahip özel bir nesne oluşturup bunu boru hattındaki Get-Calculation işlevine aktarmaya çalıştığımda bu bana hata veriyor (Şekil 3).

Şekil 3: Özel bir PS Nesnesinin Get-Calculation'a aktarılması

Trace-Command ile Sorun Giderme

Sorunu daha iyi anlamak ve hata ayıklamak için Trace-Command cmdlet'ini kullanmaya karar verdim. ardışık düzende parametre bağlamanın nasıl gerçekleştiğini gözlemlemek için. “ParameterBinderBase, ParameterBinderController, ParameterBinding” parametre bağlamasını gözlemlemek için trace-command'ı aşağıdaki seçeneklerle çalıştırdım. Aşağıdaki ekran görüntüsü Trace-Command'in çıktısını göstermektedir (Şekil 4).

Şekil 4: Parametre bağlamayı incelemek için Trace-Command'ı kullanma

Şekil 5'te nesne özelliklerini parametreye bağlamak yerine "tüm" nesnenin ($myObj) parametreye değer olarak sağlandığını görebiliriz.

Şekil 5: Parametre bağlama

Parametre Bağlama: byValue ve byProperty

Bunun nedeni, parametre niteliklerini tanımladığımda, "ValueFromPipeline=$True" ayarlamaya karar vermem, Pipeline'ın "byValue"ya bağlanmasına neden olur.

"Değerle Bağla ", gelen nesnenin parametreye değer olarak sağlanacağı anlamına gelir. İşlem Hattı, nesneyi işlemez ve nesnenin belirli özelliklerini, sonraki cmdlet/işlev için parametrelere bağlamaz. boru hattı. Trace-Command'den gelen çıktıyı gözlemlersek, boru hattı nesnemizi ({firstNumber=1; SecondNumber=4; operatör=+) parametreye bağlamaya çalışıyor demektir. “ilkNumara” vb.

Çözüm “byProperty”yi bağlamaktır. Örneğimizde, boru hattına gelen nesnenin özelliklerini parametremize bağlamasını açıkça söylememiz gerekiyor. Aşağıda gösterildiği gibi orijinal betiğimizi bağlama byProperty olarak değiştirdik (Şekil 6).

Şekil 6: Değeri özelliğe göre kabul etmek için parametre özelliği

Daha sonra davranışı Trace-Command kullanarak tekrar gözlemliyoruz. Bu sefer gördüğümüz gibi nesne özellikleri parametrelerimize doğru şekilde bağlanıyor (Şekil 7). Ancak bir sorun var: Bunun işe yaraması için gelen nesnenin özelliklerinin, işlev parametreleriyle aynı adlara sahip olması gerekir.

Şekil 7: Parametre bağlama başarılı

Test: Değere ve Özelliğe Göre Parametre Bağlama

Aynı programın bir sonraki yinelemesinde parametrelerimizi hem değer hem de özellik bazında kabul edecek şekilde değiştirdik (Şekil 8). Gösterim amacıyla, operatör parametresini değiştirip zorunlu olmaktan çıkarmaya karar verdim ve ona varsayılan olarak “+” değerini atadım.

Şekil 8: byValue ve byProperty parametresinin kabul edilmesi

Artık fonksiyonumuz hem byValue hem de byProperty seçeneğini kullanarak parametre değerlerini kabul ediyor. Biri Int türünde (Şekil 9) ve diğerine özel bir PS nesnesi (Şekil 10) türünde iki nesne gönderdiğimiz basit bir örneği ele alalım.

Şekil 9: Get-Calculation'a iki nesne sağlama

İlk sonuç olan 8'i elde ettiğimiz sonuç biraz kafa karıştırıcı olabilir ancak ikinci nesne için program beklendiği gibi çalıştı (Operatör özelliğini merak ediyorsanız bunu size ödev olarak bırakacağım).

Eski dostumuz Trace komutunu kullanarak bağlanmayı gözlemleyeceğiz. Şekil 10'da görebileceğiniz gibi, ilk nesne, Int tipindeki 4 sayısı, birinciNumber ve ikinciNumber'a bağlanır ve sonuçta toplam 8 olur. Bu, boru hattının, boru hattından değer kabul eden tüm parametrelere aynı nesneyi takacağını gösterir. “byValue” seçeneğini kullanıyorsak.

Şekil 10: Int nesnesi için parametre bağlama

PS özel nesnemiz durumunda, işlem hattının önce byValue'yu bağlamaya çalıştığını ancak başarısız olduğunu ve ardından beklendiği gibi byProperty seçeneğine geçerek parametreyi özellik adına göre bağlamaya başladığını gözlemleyebiliriz (Şekil 11).

Şekil 11: PS özel nesnesi için parametre bağlama

Çözüm

İşte bu yayından bazı önemli çıkarımlar:

  1. Parametre bağlama için varsayılan seçenek değere göre bağlamaktır.
  2. Hem byValue hem de byProperty seçeneğini işaretlemişsek, işlem hattı byValue seçeneğini kullanarak bağlama yaparak başlayacaktır.
  3. Parametreler doğrudan fonksiyona sağlanırsa işlem bloğu tam olarak bir kez yürütülür.
  4. Parametreler boru hattı tarafından sağlanıyorsa işlem bloğu, boru hattındaki her nesne için bir kez yürütülür.

Bu yazının gelişmiş işlevleri daha iyi anlamanıza ve doğru bir şekilde uygulamanıza yardımcı olacağını umuyorum.

İlgili İçerik

  • PowerShell komut dosyaları ScriptRunner'da nasıl çalışır | ScriptRunner

İlgili makaleler