Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
PSCustomObject PowerShell araç setinize eklemek için harika bir araçtır. Temel bilgilerle başlayalım ve daha gelişmiş özelliklere doğru ilerleyelim. kullanmanın PSCustomObject ardındaki fikir, yapılandırılmış veri oluşturmak için basit bir yönteme sahip olmaktır. İlk örneğe göz atarak bunun ne anlama geldiğini daha iyi anlamış olursunuz.
Uyarı
Bu makalenin özgün sürümü@KevinMarquettetarafından yazılan blogda yer almıştır. PowerShell ekibi, bu içeriği bizimle paylaştığı için Kevin'e teşekkür ederiz. Lütfen PowerShellExplained.comadresinde blogunu inceleyin.
PSCustomObject Oluşturma
PowerShell'de kullanmayı [pscustomobject] seviyorum. Kullanılabilir nesne oluşturmak hiç bu kadar kolay olmamıştı.
Bu nedenle, nesne oluşturmanın diğer yollarını atlayacağım ama bu örneklerin çoğunun PowerShell v3.0 ve daha yeni olduğunu belirtmem gerekiyor.
$myObject = [pscustomobject]@{
Name = 'Kevin'
Language = 'PowerShell'
State = 'Texas'
}
Hemen hemen her şey için karma tablo kullandığım için bu yöntem benim için oldukça iyi sonuç veriyor. Ancak Bazen PowerShell'in karma tablolara daha çok nesne gibi davranmasını istiyorum. Farkı ilk fark ettiğiniz yer, Export-Csv veya kullanmak Format-Table istediğiniz ve karma tablonun yalnızca anahtar/değer çiftleri koleksiyonu olduğunu fark ettiğiniz yerdir.
Ardından normal bir nesne gibi değerlere erişebilir ve bunları kullanabilirsiniz.
$myObject.Name
Bir hash tablosunu dönüştürme
Ben konu başlığı altındayken, bunu yapabileceğinizi biliyor muydunuz:
$myHashtable = @{
Name = 'Kevin'
Language = 'PowerShell'
State = 'Texas'
}
$myObject = [pscustomobject]$myHashtable
Nesneyi baştan oluşturmayı tercih ediyorum ama önce bir karma tabloyla çalışmanız gereken zamanlar oluyor. Oluşturucu nesne özellikleri için bir karma tablo aldığından bu örnek çalışır. Bir önemli not ise bu yöntemin işe yaradığı, ancak tam olarak eşdeğer olmadığıdır. En büyük fark, özelliklerin sırasının korunmamasıdır.
Sırayı korumak istiyorsanız, bkz Ordered Hashtable.
Eski yaklaşım
Özel nesneler oluşturmak için kullanan New-Object kişiler görmüş olabilirsiniz.
$myHashtable = @{
Name = 'Kevin'
Language = 'PowerShell'
State = 'Texas'
}
$myObject = New-Object -TypeName psobject -Property $myHashtable
Bu yol biraz daha yavaştır, ancak PowerShell'in ilk sürümlerinde en iyi seçeneğiniz olabilir.
Dosyaya kaydetme
Hashtable'ı bir dosyaya kaydetmenin en iyi yolunuN bunu JSON olarak kaydetmek olduğunu düşünüyorum. Bunu bir [pscustomobject] geri yükleyebilirsiniz.
$myObject | ConvertTo-Json -Depth 1 | Set-Content -Path $Path
$myObject = Get-Content -Path $Path | ConvertFrom-Json
Dosyaları okumanın ve dosyaya yazmanın birçok yolu başlıklı makalemde nesneleri bir dosyaya kaydetmenin diğer yollarını ele alıyorum.
Özelliklerle çalışmak
Özellik ekleme
Yeni özellikler, Add-Member ile PSCustomObject cihazınıza ekleyebilirsiniz.
$myObject | Add-Member -MemberType NoteProperty -Name 'ID' -Value 'KevinMarquette'
$myObject.ID
Özellikleri kaldırma
Ayrıca bir nesnenin özelliklerini kaldırabilirsiniz.
$myObject.psobject.Properties.Remove('ID')
.psobject, temel nesne meta verilerine erişmenizi sağlayan bir iç üyedir. İç üyeler hakkında daha fazla bilgi için bkz. about_Intrinsic_Members.
Özellik adlarını numaralandırma
Bazen bir nesnedeki tüm özellik adlarının listesi gerekir.
$myObject | Get-Member -MemberType NoteProperty | select -ExpandProperty Name
Aynı listeyi psobject özelliği üzerinden de alabiliriz.
$myobject.psobject.Properties.Name
Uyarı
Get-Member özellikleri alfabetik sırada döndürür. Özellik adlarını numaralandırmak için üye erişim işlecini kullanmak, özellikleri nesnede tanımlanma sıralarına göre döndürür.
Özelliklere dinamik olarak erişme
Özellik değerlerine doğrudan erişebildiğinizden bahsetmiştim.
$myObject.Name
Özellik adı için bir dize kullanabilirsiniz ve bu dize çalışmaya devam eder.
$myObject.'Name'
Bunu bir adım daha ileri götürebilir ve özellik adı için bir değişken kullanabiliriz.
$property = 'Name'
$myObject.$property
Garip göründüğünü biliyorum ama işe yarıyor.
PSCustomObject'i karma tabloya dönüştürme
Önceki bölümden devam etmek için, özelliklerin adımlarını dinamik olarak takip edebilir ve bunlardan bir hash tablosu oluşturabilirsiniz.
$hashtable = @{}
foreach( $property in $myobject.psobject.Properties.Name )
{
$hashtable[$property] = $myObject.$property
}
Özelliklerin testi
Bir özelliğin mevcut olup olmadığını bilmeniz gerekiyorsa, bu özelliğin bir değere sahip olup olmadığını de denetlemeniz yeterlidir.
if( $null -ne $myObject.ID )
Ancak $null değeri olabiliyorsa, psobject.Properties'yi kontrol ederek onun var olup olmadığını denetleyebilirsiniz.
if( $myobject.psobject.Properties.Match('ID').Count )
Nesne yöntemleri ekleme
Bir nesneye bir betik yöntemi eklemeniz gerekiyorsa, bunu Add-Member ve ScriptBlock ile yapabilirsiniz. Geçerli nesneye başvuruda bulunan this otomatik değişkeni kullanmanız gerekir. Burada, bir nesneyi bir karma tabloya dönüştürmek için bir scriptblock bulunur. (son örnekle aynı kod formu)
$ScriptBlock = {
$hashtable = @{}
foreach( $property in $this.psobject.Properties.Name )
{
$hashtable[$property] = $this.$property
}
return $hashtable
}
Ardından bunu nesnemize betik özelliği olarak ekleriz.
$memberParam = @{
MemberType = "ScriptMethod"
InputObject = $myobject
Name = "ToHashtable"
Value = $scriptBlock
}
Add-Member @memberParam
Ardından işlevimizi şu şekilde çağırabiliriz:
$myObject.ToHashtable()
Nesneler ve Değer türleri karşılaştırması
Nesneler ve değer türleri değişken atamalarını aynı şekilde işlemez. Değer türlerini birbirine atarsanız, yalnızca değer yeni değişkene kopyalanır.
$first = 1
$second = $first
$second = 2
Bu durumda, $first 1 ve $second 2'dir.
Nesne değişkenleri, gerçek nesneye bir başvuru içerir. Yeni bir değişkene bir nesne atadığınızda, bunlar yine de aynı nesneye başvurur.
$third = [pscustomobject]@{Key=3}
$fourth = $third
$fourth.Key = 4
Çünkü $third ve $fourth bir nesnenin aynı örneğine başvuruda bulunduğu için, hem $third.key hem de $fourth.Key 4'tür.
psobject. Copy()
Bir nesnenin gerçek bir kopyasına ihtiyacınız varsa, nesneyi kopyalayabilirsiniz.
$third = [pscustomobject]@{Key=3}
$fourth = $third.psobject.Copy()
$fourth.Key = 4
Clone, nesnenin sığ bir kopyasını oluşturur. Şimdi farklı örnekleri vardır ve $third.key bu örnekte 3 ve $fourth.Key 4'dür.
İç içe nesnelere sahipseniz (özelliklere sahip nesneler başka nesneler içerir) yalnızca en üst düzey değerler kopyalandığından buna sığ bir kopya diyorum. Alt nesneler birbirine referans gösterir.
Özel nesne türleri için PSTypeName
Artık bir nesnemiz olduğuna göre, bu nesneyle yapabileceğimiz pek de göze çarpmayan birkaç şey daha var. İlk adım olarak ona bir PSTypeName vermek. İnsanların bunu en yaygın şekilde yapabileceğini görüyorum:
$myObject.psobject.TypeNames.Insert(0,"My.Object")
Yakın zamanda Redditor'dan u/markekrausbunu yapmak için başka bir yol keşfettim. Satır içinde tanımlamanızı sağlayan bu yaklaşımdan bahsediyor.
$myObject = [pscustomobject]@{
PSTypeName = 'My.Object'
Name = 'Kevin'
Language = 'PowerShell'
State = 'Texas'
}
Bunun dile sığma şekline bayılıyorum. Artık uygun tür adına sahip bir nesnemiz olduğuna göre, bazı daha fazla işlem yapabiliriz.
Uyarı
Ayrıca, PowerShell sınıflarını kullanarak özel PowerShell türleri de oluşturabilirsiniz. Daha fazla bilgi için bkz. PowerShell Sınıfına Genel Bakış.
DefaultPropertySet kullanma (uzun yol)
PowerShell, varsayılan olarak hangi özelliklerin görüntüleneceğine karar verir. Yerel komutların çoğu, tüm ağır kaldırma işlemini gerçekleştiren bir .ps1xmlbiçimlendirme dosyasına sahiptir.
Boe Prox'un bu gönderisinden, yalnızca PowerShell kullanarak özel nesnemizde bunu yapmamızın başka bir yolu vardır. Kullanması için bir MemberSet verebiliriz.
$defaultDisplaySet = 'Name','Language'
$defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet',[string[]]$defaultDisplaySet)
$PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet)
$MyObject | Add-Member MemberSet PSStandardMembers $PSStandardMembers
Artık nesnem yalnızca kabuğa düştüğünde, varsayılan olarak yalnızca bu özellikleri gösterir.
DefaultPropertySet ile Update-TypeData
Bu güzel ama yakın zamanda varsayılan özellikleri belirtmek için Update-TypeData'yı kullanmanın daha iyi bir yolunu gördüm.
$TypeData = @{
TypeName = 'My.Object'
DefaultDisplayPropertySet = 'Name','Language'
}
Update-TypeData @TypeData
Bu kadar basit ki, elimde bu gönderi hızlı bir başvuru olarak olmasaydı neredeyse hatırlayabilirdim. Artık birçok özelliğe sahip nesneleri kolayca oluşturabilir ve kabuktan bakıldığında yine de hoş ve düzenli bir görünüm sunabilirim. Diğer özelliklere erişmem veya bunları görmem gerekirse, hala mevcutlar.
$myObject | Format-List *
ScriptProperty ile Update-TypeData
Bu videodan aldığım başka bir şey de nesneleriniz için betik özellikleri oluşturmaktı. Bunun mevcut nesneler için de işe yaradığını belirtmek için iyi bir zaman olabilir.
$TypeData = @{
TypeName = 'My.Object'
MemberType = 'ScriptProperty'
MemberName = 'UpperCaseName'
Value = {$this.Name.ToUpper()}
}
Update-TypeData @TypeData
Bunu, nesneniz oluşturulmadan önce veya sonra da yapabilirsiniz ve çalışmaya devam eder. Bu durumu betik özelliğiyle Add-Member kullanmaktan farklı kılan budur. Daha önce başvurdığım şekilde kullandığınızda Add-Member , yalnızca nesnenin belirli bir örneğinde var olur. Bu, tüm TypeName nesneler için geçerlidir.
İşlev parametreleri
Artık işlevlerinizdeki ve betiklerinizdeki parametreler için bu özel türleri kullanabilirsiniz. Bir işlevin bu özel nesneleri oluşturmasını ve sonra bunları diğer işlevlere geçirmesini sağlayabilirsiniz.
param( [PSTypeName('My.Object')]$Data )
PowerShell, nesnenin belirttiğiniz tür olmasını gerektirir. Türün kodunuzda test etme adımını kaydetmeniz için otomatik olarak eşleşmemesi durumunda bir doğrulama hatası oluşturur. PowerShell'in en iyi yaptığı işi yapmasına izin vermenin harika bir örneği.
İşlev Çıktı Türü
Gelişmiş işlevleriniz için de bir OutputType tanımlayabilirsiniz.
function Get-MyObject
{
[OutputType('My.Object')]
[CmdletBinding()]
param
(
...
OutputType öznitelik değeri yalnızca bir belge notudur. İşlev kodundan türetilmiş değildir veya gerçek işlev çıkışıyla karşılaştırılamaz.
Çıkış türünü kullanmanızın temel nedeni, işlevinizle ilgili meta bilgilerin amacınızı yansıtmasıdır. Geliştirme ortamınızın yararlanabileceği Get-Command ve Get-Help gibi şeyler. Daha fazla bilgi edinmek istiyorsanız yardım bölümüne göz atın: about_Functions_OutputTypeAttribute.
Bununla birlikte, işlevlerinizi birim testi için Pester kullanıyorsanız çıkış nesnelerinin OutputType'ınızla eşleşeceğini doğrulamak iyi bir fikir olacaktır. Bu, boru hattına düşmemesi gereken değişkenleri tespit edebilir.
Kapanış düşünceleri
Bu, [pscustomobject] ile ilgiliydi; ancak bu bilgilerin çoğu genel olarak nesneler için geçerlidir.
Bu özelliklerin çoğunu daha önce üstünkörü görmüştüm, fakat PSCustomObject üzerindeki bir bilgi koleksiyonu olarak sunulduklarını hiç görmedim. Sadece geçen hafta başka bir taneyle karşılaştım ve daha önce görmediğim için şaşırdım. Tüm bu fikirleri bir araya getirmek istedim, böylece daha büyük bir resmi görebilmeniz ve bunları kullanma fırsatınız olduğunda bunları fark edebilmeniz için. Umarım bir şeyler öğrenmişsinizdir ve bunu senaryolarınızda çalıştırmanın bir yolunu bulursunuz.
PowerShell