Genişletilmiş Tür Sistemine Genel Bakış

PowerShell, nesne türlerini iki şekilde genişletmek için PSObject nesnesini kullanır. İlk olarak, PSObject nesnesi belirli nesne türlerinin farklı görünümlerini göstermek için bir yol sağlar. Bu, bir nesnenin uyarlanmış görünümünü göstermek olarak adlandırılır. İkincisi, PSObject nesnesi, var olan nesneye üye eklemenin bir yolunu sağlar. PSObject nesnesi, temel nesne olarak adlandırılan mevcut bir nesneyi birlikte sarmalayarak betik ve cmdlet geliştiricilerin kabuk içindeki .NET nesnelerini işlemek için kullanabilecekleri genişletilmiş bir tür sistemi (ETS) sağlar.

Cmdlet ve Betik Geliştirme Sorunları

ETS iki temel sorunu çözer:

İlk olarak, bazı .NET Nesneleri cmdlet'ler arasında veri olarak hareket etmek için gerekli varsayılan davranışa sahip değildir.

  • Bazı .NET nesneleri, üyeleri içerdikleri verileri açıklayan "meta" nesnelerdir (örneğin: WMI Nesneleri, ADO nesneleri ve XML nesneleri). Ancak, bir betik ortamında, kapsanan verilerin açıklaması değil, en ilginç olan, kapsanan verilerdir. ETS, temel alınan .NET nesnesini beklenen varsayılan semantiklere sahip olacak şekilde uyarlayan Bağdaştırıcılar'ı tanıtarak bu sorunu çözer.
  • Bazı .NET Nesne üyeleri tutarsız olarak adlandırılır, yetersiz bir ortak üye kümesi sağlar veya yetersiz yetenek sağlar. ETS, .NET nesnesini ek üyelerle genişletme özelliğini kullanıma sunarak bu sorunu çözer.

İkincisi, PowerShell betik dilinin türüz bir değişkenin belirli bir türe göre bildirilmesi gerekmemesidir. Yani, bir betik geliştiricisinin oluşturduğu değişkenler doğası gereği türüz. Ancak PowerShell sistemi, sonuçların çıkışı veya sıralama gibi temel işlemler için kullanılacak bir tür adına sahip olmasına bağlı olduğundan "tür temellidir".

Bu nedenle, bir betik geliştiricisinin değişkenlerinden birinin türünü belirtebilmesi ve özellikler ve yöntemler içeren ve tür temelli sisteme katılabilen kendi dinamik olarak yazılan "nesneler" kümesini oluşturması gerekir. ETS, betik dili için türünü dinamik olarak belirtme ve üyeleri dinamik olarak ekleme özelliğine sahip ortak bir nesne sağlayarak bu sorunu çözer.

ETS temel olarak, betik dilinden tüm nesne erişiminin temelini oluşturan ve cmdlet geliştiricisi için standart bir soyutlama sağlayan PSObject nesnesini sağlayarak daha önce bahsedilen sorunu çözer.

Cmdlet Geliştiricileri

CMdlet geliştiricileri için ETS aşağıdaki desteği sağlar:

  • PSObject nesnesini kullanarak nesnelere karşı genel bir şekilde çalışacak soyutlamalar. ETS, gerekirse bu soyutlamaların detayına gitme olanağı da sağlar.
  • İyi bilinen bir genişletilmiş üye kümesi kullanarak nesne türlerini biçimlendirmek, sıralamak, seri hale getirmek ve diğer sistem işlemeleri için varsayılan bir davranış oluşturmaya yönelik mekanizmalar.
  • LanguagePrimitives nesnesi kullanarak betik diliyle aynı semantiği kullanarak herhangi bir nesneye karşı çalışma anlamına gelir.
  • Sistemin geri kalanının buna karşı etkili bir şekilde çalışabilmesi için karma tabloyu dinamik olarak "yazma" anlamına gelir.

Betik Geliştiricileri

Betik geliştiricileri için ETS aşağıdaki desteği sağlar:

  • Aynı söz dizimini ($a.x) kullanarak herhangi bir temel nesne türüne başvurabilme özelliği.
  • PSObject nesnesi (yalnızca uyarlanmış üyelere erişme veya temel nesnenin kendisine erişme gibi) tarafından sağlanan soyutlamanın ötesinde erişim olanağı.
  • Nesne örneğinin veya türünün biçimlendirmesini, sıralamasını, serileştirmesini ve diğer işlemelerini denetleyebilen iyi bilinen üyeleri tanımlama özelliği.
  • Bir nesneyi belirli bir tür olarak adlandırmak ve böylece türü tabanlı üyelerin devralmayı denetlemek anlamına gelir.
  • Genişletilmiş üyeleri ekleme, kaldırma ve değiştirme olanağı.
  • Gerekirse PSObject nesnesinin kendisini işleme yeteneği.

PSObject sınıfı

PSObject nesnesi, betik dilinden tüm nesne erişiminin temelini oluşturur ve cmdlet geliştiricisi için standart bir soyutlama sağlar. Bir temel nesne (bir .NET nesnesi) ve tüm örnek üyelerini (belirli bir nesne örneğinde mevcut olan ve aynı türdeki diğer nesneler üzerinde olması gerekmeyen üyeler, özellikle genişletilmiş üyeler) içerir. Temel nesnenin türüne bağlı olarak, PSObject nesnesi, uyarlanmış üyelere ve tür tabanlı genişletilmiş üyelere örtük ve açık erişim de sağlayabilir.

PSObject nesnesi aşağıdaki mekanizmaları sağlar:

  • bir PSObject oluşturma özelliği, temel nesneyle veya temel nesne olmadan.
  • PsObject nesnesinin her tüm üyelerine ortak bir arama algoritması aracılığıyla erişebilme ve gerektiğinde bu algoritmayı geçersiz kılma olanağı.
  • Betiklerin ve cmdlet'lerin benzer PSObject nesnelerine base-object türünden bağımsız olarak aynı türe göre başvurabilmesi için psobject nesneleri tür adlarını alma ve ayarlama yeteneği.

PSObject Oluşturma

Aşağıdaki listede PSObject nesnesi oluşturmanın yolları açıklanmaktadır:

  • PSObject .#ctor oluşturucusunun çağrılması, PSCustomObject'in temel nesnesiyle yeni bir PSObject nesnesi oluşturur. Bu tür bir temel nesne, PSObject nesnesinin anlamlı bir temel nesnesi olmadığını gösterir. Ancak, bu tür bir temel nesneye sahip PSObject nesnesi, cmdlet geliştiricilerinin genişletilmiş üyeler ekleyerek yararlı bulabileceği bir özellik paketi sağlar.

Geliştiriciler, bu nesnenin genişletilmiş üyelerini aynı tür-ada sahip diğer PSObject nesneleriyle paylaşmasına olanak tanıyan nesne türü-adını da belirtebilir.

  • PSObject .#ctor(System.Object) oluşturucusunun çağrılması, System.Object türünde bir temel nesnesi olan yeni bir PSObject nesnesi oluşturur.

    Bu durumda, oluşturulan nesnenin tür adı, temel nesnenin türetme hiyerarşisinin bir koleksiyonudur. Örneğin, ProcessInfo base-object içeren PSObject için tür-adı aşağıdaki adları içerir:

    • System.Diagnostics.Process
    • System.ComponentModel.Component
    • System.MarshalByRefObject
    • System.Object
  • PSObject çağırma. AsPSObject(System.Object) yöntemi, sağlanan nesneyi temel alan yeni bir PSObject nesnesi oluşturur.

    Sağlanan nesne System.Object türündeyse, sağlanan nesne yeni PSObject nesnesi için temel nesne olarak kullanılır. Sağlanan nesne zaten bir PSObject nesnesiyse, sağlanan nesne olduğu gibi döndürülür.

Temel, uyarlanmış ve genişletilmiş üyeler

Kavramsal olarak ETS, temel nesnenin özgün üyeleriyle PowerShell tarafından eklenen üyeler arasındaki ilişkiyi göstermek için aşağıdaki terimleri kullanır. PSObject nesnesi tarafından kullanılan belirli üye türleri hakkında daha fazla bilgi için bkz. PSObject sınıfı.

Temel nesne üyeleri

PSObject nesneleri oluşturulurken base-object belirtilirse, base-object üyeleri Members özelliği aracılığıyla kullanılabilir hale getirilir.

Uyarlanmış üyeler

Temel nesne, içerdiği verileri "açıklayan" genel bir şekilde veri içeren bir meta nesne olduğunda, ETS bu nesneleri PSObject nesnesinin uyarlanmış üyeleri aracılığıyla verilere doğrudan erişim sağlayan bir görünüme uyarlar. Uyarlanmış üyelere ve temel nesne üyelerine Members özelliği aracılığıyla erişilir.

Genişletilmiş üyeler

Bir PSObject, temel nesneden veya PowerShell tarafından oluşturulan uyarlanmış üyelerden sağlanan üyelere ek olarak, betik ortamında yararlı olan ek bilgilerle özgün temel nesneyi genişleten genişletilmiş üyeler de tanımlayabilir.

Örneğin, Get-Content ve Set-Content cmdlet'leri gibi PowerShell tarafından sağlanan tüm çekirdek cmdlet'ler bir Path parametresi alır. Bu cmdlet'lerin ve diğer cmdlet'lerin farklı türlerdeki nesnelerle çalışabileceğinden emin olmak için, bu nesnelere bir Yol üyesi eklenebilir, böylece hepsi bilgilerini ortak bir şekilde belirtir. Bu genişletilmiş Yol üyesi, temel sınıfın Path üyesi olmasa bile cmdlet'lerin tüm bu türlerde çalışabilmesini sağlar.

Genişletilmiş üyelere, uyarlanmış üyelere ve temel nesne üyelerine Members özelliği aracılığıyla erişilir.