Genişletilmiş Tip Sisteme 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östermenin bir yolunu sağlar. Buna bir nesnenin uyarlanmış görünümünün gösterilmesi denir. İkinci olarak, PSObject nesnesi mevcut nesneye üye eklemenin bir yolunu sağlar. PSObject nesnesi, temel nesne olarak adlandırılan mevcut bir nesneyi birlikte sarmalayarak, komut dosyası ve cmdlet geliştiricilerinin kabuk içindeki .NET nesnelerini işlemek için kullanabileceği genişletilmiş bir tür sistemi (ETS) sağlar.
Cmdlet ve Komut Dosyası Geliştirme Sorunları
ETS iki temel sorunu çözmektedir:
İlk olarak, bazı .NET Nesneleri, cmdlet'ler arasında veri görevi görmek için gerekli varsayılan davranışa sahip değildir.
- Bazı .NET nesneleri, üyeleri içerdikleri verileri tanımlayan "meta" nesnelerdir (örneğin: WMI Nesneleri, ADO nesneleri ve XML nesneleri). Bununla birlikte, bir komut dosyası oluşturma ortamında en ilginç olan, içerilen verilerin açıklaması değil, içerilen verilerdir. ETS, temeldeki .NET nesnesini beklenen varsayılan semantiklere sahip olacak şekilde uyarlayan Bağdaştırıcılar kavramını sunarak bu sorunu çözer.
- Bazı .NET Object üyeleri tutarsız bir şekilde adlandırılıyor, yetersiz sayıda ortak üye sağlıyor veya yetersiz yetenek sağlıyor. ETS, .NET nesnesini ek üyelerle genişletme özelliğini sunarak bu sorunu çözer.
İkincisi, PowerShell betik dili türsüzdür, çünkü bir değişkenin belirli bir türde bildirilmesine gerek yoktur. Yani, bir komut dosyası geliştiricisinin oluşturduğu değişkenler doğası gereği tipsizdir. Bununla birlikte, PowerShell sistemi "tür odaklıdır", çünkü sonuçların çıktısını almak veya sıralamak gibi temel işlemler için çalışacak bir tür adına sahip olmaya bağlıdır.
Bu nedenle bir komut dosyası geliştiricisinin, değişkenlerinden birinin türünü belirtme ve özellikler ve yöntemler içeren ve tür odaklı sisteme katılabilen kendi dinamik olarak yazılan "nesneler" kümesini oluşturma becerisine sahip olması gerekir. ETS, betik dili için türünü dinamik olarak belirtme ve dinamik olarak üye ekleme yeteneğine sahip ortak bir nesne sağlayarak bu sorunu çözer.
Temel olarak ETS, komut dosyası 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 nesneler üzerinde genel bir şekilde çalışacak soyutlamalar. ETS ayrıca gerektiğinde bu soyutlamaların detayına inme olanağı da sağlar.
- İyi bilinen bir genişletilmiş üye kümesini kullanarak biçimlendirme, sıralama, serileştirme ve nesne türlerinin diğer sistem manipülasyonları için varsayılan bir davranış oluşturmaya yönelik mekanizmalar.
- LanguagePrimitives nesnesini kullanarak komut dosyası diliyle aynı semantiği kullanarak herhangi bir nesneye karşı işlem yapma anlamına gelir.
- Sistemin geri kalanının etkili bir şekilde çalışabilmesi için karma tablosunu dinamik olarak "yazmak" anlamına gelir.
Komut Dosyası Geliştiricileri
Komut dosyası geliştiricileri için ETS aşağıdaki desteği sağlar:
- Aynı sözdizimini (
$a.x) kullanarak herhangi bir temel nesne türüne başvuruda bulunabilme yeteneği. - PSObject nesnesi tarafından sağlanan soyutlamanın ötesine erişim yeteneği (yalnızca uyarlanmış üyelere erişim veya temel nesnenin kendisine erişim gibi).
- Bir nesne örneğinin veya türünün biçimlendirmesini, sıralamasını, serileştirmesini ve diğer işlemlerini kontrol eden iyi bilinen üyeleri tanımlama yeteneği.
- Bir nesneyi belirli bir tür olarak adlandırmak ve böylece türe dayalı üyelerinin mirasını denetlemek anlamına gelir.
- Genişletilmiş üyeleri ekleme, kaldırma ve değiştirme yeteneği.
- Gerektiğinde PSObject nesnesinin kendisini değiştirme yeteneği.
PSObject sınıfı
PSObject nesnesi, komut dosyası dilinden yapılan tüm nesne erişiminin temelidir ve cmdlet geliştiricisi için standart bir soyutlama sağlar. Bir temel nesneyi (bir .NET nesnesi) ve tüm örnek üyelerini (aynı türdeki diğer nesnelerde olması gerekmeyen, belirli bir nesne örneğinde mevcut olan üyeler, özellikle genişletilmiş üyeler) içerir. Temel nesnenin türüne bağlı olarak PSObject nesnesi, tür tabanlı genişletilmiş üyelerin yanı sıra uyarlanmış üyelere de örtülü ve açık erişim sağlayabilir.
PSObject nesnesi aşağıdaki mekanizmaları sağlar:
- Temel nesneyle veya temel nesne olmadan bir PSObject oluşturma yeteneği.
- Oluşturulan her PSObject nesnesinin tüm üyelerine ortak bir arama algoritması aracılığıyla erişme yeteneği ve gerektiğinde bu algoritmayı geçersiz kılma yeteneği.
- Komut dosyalarının ve cmdlet'lerin türden bağımsız olarak benzer PSObject nesnelerine aynı tür adıyla başvuruda bulunabilmesi için oluşturulan PSObject nesnelerinin tür adlarını alma ve ayarlama yeteneği temel nesnelerinin.
PSObject Nasıl Oluşturulur
Aşağıdaki listede PSObject nesnesi oluşturmanın yolları açıklanmaktadır:
- PSObject .#ctor yapıcısının çağrılması, PSCustomObject temel nesnesine sahip yeni bir PSObject nesnesi oluşturur. Bu türden bir temel nesne, PSObject nesnesinin anlamlı bir temel nesnesi olmadığını gösterir. Ancak, bu tür temel nesneye sahip bir PSObject nesnesi, cmdlet geliştiricilerinin genişletilmiş üyeler ekleyerek yararlı bulabileceği bir özellik çantası sağlar.
Geliştiriciler ayrıca bu nesnenin genişletilmiş üyelerini aynı tür adındaki diğer PSObject nesneleriyle paylaşmasına olanak tanıyan nesne türü adını da belirtebilir.
PSObject .#ctor(System.Object) yapıcısının çağrılması, System.Object türünde temel nesneye sahip 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 temel nesnesini içeren PSObject'in tür adı aşağıdaki adları içerir:
- System.Diagnostics.Process
- System.ComponentModel.Component
- System.MarshalByRefObject
- Sistem.Nesne
PSObject .AsPSObject(System.Object) yönteminin çağrılması, 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 orijinal üyeleri ile 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 temel nesne belirtilirse, temel nesnenin üyeleri, Üyeler özelliği aracılığıyla kullanılabilir hale getirilir.
Uyarlanmış üyeler
Bir temel nesne, özellikleri içerdikleri verileri "tanımlayan" jenerik tarzda veriler içeren bir meta-nesne olduğunda, ETS bu nesneleri, PSObject nesnesi. Uyarlanmış üyelere ve temel nesne üyelerine Üyeler özelliği aracılığıyla erişilir.
Genişletilmiş üyeler
Temel nesneden kullanıma sunulan üyelere veya PowerShell tarafından oluşturulan uyarlanmış üyelere ek olarak, bir PSObject ayrıca orijinal temel nesneyi komut dosyası oluşturmada yararlı olan ek bilgilerle genişleten genişletilmiş üyeler de tanımlayabilir. çevre.
Örneğin, Get-Content ve Set-Content cmdlet'leri gibi PowerShell tarafından sağlanan tüm temel cmdlet'ler bir yol parametresi alır. Bu cmdlet'lerin ve diğerlerinin farklı türdeki nesnelere karşı çalışabilmesini sağlamak için bu nesnelere bir Yol üyesi eklenebilir, böylece hepsi bilgilerini ortak bir şekilde ifade edebilir. Bu genişletilmiş Path üyesi, temel sınıfın bir Path üyesi olmasa bile cmdlet'lerin tüm bu türlerle çalışabilmesini sağlar.
Genişletilmiş üyelere, uyarlanmış üyelere ve temel nesne üyelerine Üyeler özelliği aracılığıyla erişilir.