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.
Kısa açıklama
Kendi özel türlerinizi oluşturmak için sınıfları nasıl kullanabileceğinizi açıklar.
Uzun açıklama
Sürüm 5.0'dan başlayarak, PowerShell'in sınıfları ve diğer kullanıcı tanımlı türleri tanımlamak için resmi bir söz dizimi vardır. Sınıfların eklenmesi, geliştiricilerin ve BT uzmanlarının daha geniş bir kullanım örneği yelpazesi için PowerShell'i benimsemesini sağlar.
Sınıf bildirimi, çalışma zamanında nesne örnekleri oluşturmak için kullanılan bir şemadır. Bir sınıf tanımladığınızda, sınıf adı türün adıdır. Örneğin, Device adlı bir sınıf bildirir ve $dev'nin yeni bir örneğine bir değişken başlatırsanız, $devDevicetüründe bir nesne veya örnektir.
Cihaz her örneğinin özelliklerinde farklı değerler olabilir.
Desteklenen senaryolar
- Sınıflar, özellikler, yöntemler, devralma gibi nesne odaklı programlama semantiği kullanarak PowerShell'de özel türler tanımlayın.
- PowerShell dilini kullanarak DSC kaynaklarını ve ilişkili türlerini tanımlayın.
- Değişkenleri, parametreleri ve özel tür tanımlarını süslemek için özel öznitelikler tanımlayın.
- Tür adlarına göre yakalanabilecek özel özel durumlar tanımlayın.
Sözdizimi
Tanım söz dizimi
Sınıf tanımları aşağıdaki söz dizimini kullanır:
class <class-name> [: [<base-class>][,<interface-list>]] {
[[<attribute>] [hidden] [static] <property-definition> ...]
[<class-name>([<constructor-argument-list>])
{<constructor-statement-list>} ...]
[[<attribute>] [hidden] [static] <method-definition> ...]
}
Örnek oluşturma söz dizimi
Bir sınıfın örneğini oluşturmak için aşağıdaki söz dizimlerinden birini kullanın:
[$<variable-name> =] New-Object -TypeName <class-name> [
[-ArgumentList] <constructor-argument-list>]
[$<variable-name> =] [<class-name>]::new([<constructor-argument-list>])
[$<variable-name> =] [<class-name>]<convertable-value-type>
Not
[<class-name>]::new() söz dizimi kullanılırken, sınıf adının etrafındaki köşeli ayraçlar zorunlu olur. Köşeli ayraçlar PowerShell için bir tür tanımı sinyali verir.
Söz <convertable-value-type> dizimi yalnızca parametre beklemeyen varsayılan bir oluşturucuya sahip sınıflar için çalışır. Varsayılan oluşturucu ile sınıfının bir örneğini oluşturur ve sağlanan değerleri atamak için çalışma zamanı türü dönüştürmeyi kullanır.
Örnekler
Örnek 1 - Minimum tanım
Bu örnekte, kullanılabilir bir sınıf oluşturmak için gereken en düşük söz dizimi gösterilmektedir.
class Device {
[string]$Brand
}
$dev = [Device]::new()
$dev.Brand = "Fabrikam, Inc."
$dev
Brand
-----
Fabrikam, Inc.
Örnek 2 - Örnek oluşturma söz dizimini kullanma
Bu örnek, birkaç özelliğe sahip ancak oluşturucu içermeyen bir Book sınıfını tanımlar.
class Book {
# Class properties
[string] $Title
[string] $Author
[string] $Synopsis
[string] $Publisher
[datetime] $PublishDate
[int] $PageCount
[string[]] $Tags
}
Aşağıdaki örnekte, varsayılan oluşturucunun tür zorlamasını kullanarak değerleri uyumlu bir değerden nasıl atayabileceği gösterilmektedir. Bu örnekte, özellik değerlerini sağlamak için bir karma tablo kullanılır.
$Book1 = [Book] @{
Title = '1984'
Author = 'George Orwell'
Synopsis = ''
Publisher = 'Secker & Warburg'
PublishDate = '1949-06-08'
PageCount = 328
Tags = @('Dystopian', 'Political Fiction', 'Social Science Fiction')
}
$Book1
Title : 1984
Author : George Orwell
Synopsis :
Publisher : Secker & Warburg
PublishDate : 6/8/1949 12:00:00 AM
PageCount : 328
Tags : {Dystopian, Political Fiction, Social Science Fiction}
Karma tablo anahtar-değer çiftleri örnek özelliklerine atanır. Karma tablodaki herhangi bir anahtar geçerli bir özellik adı değilse, örnekleme başarısız olur.
Bu örnekte, genel listenin değerlerini sağlamak için bir dizi kullanılır.
$List = [System.Collections.Generic.List[int]] @(42, 43)
$List
42
43
Örnek 3 - Örnek üyeleriyle sınıf
Bu örnek çeşitli özelliklere, oluşturuculara ve yöntemlere sahip bir Book sınıfını tanımlar. Tanımlanan her üye statik üye değil, bir örneğidir. Özelliklere ve yöntemlere yalnızca sınıfın oluşturulmuş bir örneği aracılığıyla erişilebilir.
class Book {
# Class properties
[string] $Title
[string] $Author
[string] $Synopsis
[string] $Publisher
[datetime] $PublishDate
[int] $PageCount
[string[]] $Tags
# Default constructor
Book() { $this.Init(@{}) }
# Convenience constructor from hashtable
Book([hashtable]$Properties) { $this.Init($Properties) }
# Common constructor for title and author
Book([string]$Title, [string]$Author) {
$this.Init(@{Title = $Title; Author = $Author })
}
# Shared initializer method
[void] Init([hashtable]$Properties) {
foreach ($Property in $Properties.Keys) {
$this.$Property = $Properties.$Property
}
}
# Method to calculate reading time as 2 minutes per page
[timespan] GetReadingTime() {
if ($this.PageCount -le 0) {
throw 'Unable to determine reading time from page count.'
}
$Minutes = $this.PageCount * 2
return [timespan]::new(0, $Minutes, 0)
}
# Method to calculate how long ago a book was published
[timespan] GetPublishedAge() {
if (
$null -eq $this.PublishDate -or
$this.PublishDate -eq [datetime]::MinValue
) { throw 'PublishDate not defined' }
return (Get-Date) - $this.PublishDate
}
# Method to return a string representation of the book
[string] ToString() {
return "$($this.Title) by $($this.Author) ($($this.PublishDate.Year))"
}
}
Aşağıdaki kod parçacığı sınıfın bir örneğini oluşturur ve nasıl davrandığını gösterir.
Book sınıfının bir örneğini oluşturduktan sonra örnek, kitap hakkında bir ileti yazmak için GetReadingTime() ve GetPublishedAge() yöntemlerini kullanır.
$Book = [Book]::new(@{
Title = 'The Hobbit'
Author = 'J.R.R. Tolkien'
Publisher = 'George Allen & Unwin'
PublishDate = '1937-09-21'
PageCount = 310
Tags = @('Fantasy', 'Adventure')
})
$Book
$Time = $Book.GetReadingTime()
$Time = @($Time.Hours, 'hours and', $Time.Minutes, 'minutes') -join ' '
$Age = [Math]::Floor($Book.GetPublishedAge().TotalDays / 365.25)
"It takes $Time to read $Book,`nwhich was published $Age years ago."
Title : The Hobbit
Author : J.R.R. Tolkien
Synopsis :
Publisher : George Allen & Unwin
PublishDate : 9/21/1937 12:00:00 AM
PageCount : 310
Tags : {Fantasy, Adventure}
It takes 10 hours and 20 minutes to read The Hobbit by J.R.R. Tolkien (1937),
which was published 86 years ago.
Örnek 4 - Statik üyeleri olan sınıf
Bu örnekteki BookList sınıfı, önceki örnekteki Book sınıfını oluşturur. BookList sınıfı statik olarak işaretlenemez ancak uygulama yalnızca Books statik özelliğini ve bu özelliği yönetmek için bir dizi statik yöntemi tanımlar.
class BookList {
# Static property to hold the list of books
static [System.Collections.Generic.List[Book]] $Books
# Static method to initialize the list of books. Called in the other
# static methods to avoid needing to explicit initialize the value.
static [void] Initialize() { [BookList]::Initialize($false) }
static [bool] Initialize([bool]$Force) {
if ([BookList]::Books.Count -gt 0 -and -not $Force) {
return $false
}
[BookList]::Books = [System.Collections.Generic.List[Book]]::new()
return $true
}
# Ensure a book is valid for the list.
static [void] Validate([book]$Book) {
$Prefix = @(
'Book validation failed: Book must be defined with the Title,'
'Author, and PublishDate properties, but'
) -join ' '
if ($null -eq $Book) { throw "$Prefix was null" }
if ([string]::IsNullOrEmpty($Book.Title)) {
throw "$Prefix Title wasn't defined"
}
if ([string]::IsNullOrEmpty($Book.Author)) {
throw "$Prefix Author wasn't defined"
}
if ([datetime]::MinValue -eq $Book.PublishDate) {
throw "$Prefix PublishDate wasn't defined"
}
}
# Static methods to manage the list of books.
# Add a book if it's not already in the list.
static [void] Add([Book]$Book) {
[BookList]::Initialize()
[BookList]::Validate($Book)
if ([BookList]::Books.Contains($Book)) {
throw "Book '$Book' already in list"
}
$FindPredicate = {
param([Book]$b)
$b.Title -eq $Book.Title -and
$b.Author -eq $Book.Author -and
$b.PublishDate -eq $Book.PublishDate
}.GetNewClosure()
if ([BookList]::Books.Find($FindPredicate)) {
throw "Book '$Book' already in list"
}
[BookList]::Books.Add($Book)
}
# Clear the list of books.
static [void] Clear() {
[BookList]::Initialize()
[BookList]::Books.Clear()
}
# Find a specific book using a filtering scriptblock.
static [Book] Find([scriptblock]$Predicate) {
[BookList]::Initialize()
return [BookList]::Books.Find($Predicate)
}
# Find every book matching the filtering scriptblock.
static [Book[]] FindAll([scriptblock]$Predicate) {
[BookList]::Initialize()
return [BookList]::Books.FindAll($Predicate)
}
# Remove a specific book.
static [void] Remove([Book]$Book) {
[BookList]::Initialize()
[BookList]::Books.Remove($Book)
}
# Remove a book by property value.
static [void] RemoveBy([string]$Property, [string]$Value) {
[BookList]::Initialize()
$Index = [BookList]::Books.FindIndex({
param($b)
$b.$Property -eq $Value
}.GetNewClosure())
if ($Index -ge 0) {
[BookList]::Books.RemoveAt($Index)
}
}
}
BookList tanımlandığına göre, önceki örnekteki kitap listeye eklenebilir.
$null -eq [BookList]::Books
[BookList]::Add($Book)
[BookList]::Books
True
Title : The Hobbit
Author : J.R.R. Tolkien
Synopsis :
Publisher : George Allen & Unwin
PublishDate : 9/21/1937 12:00:00 AM
PageCount : 310
Tags : {Fantasy, Adventure}
Aşağıdaki kod parçacığı, sınıfı için statik yöntemleri çağırır.
[BookList]::Add([Book]::new(@{
Title = 'The Fellowship of the Ring'
Author = 'J.R.R. Tolkien'
Publisher = 'George Allen & Unwin'
PublishDate = '1954-07-29'
PageCount = 423
Tags = @('Fantasy', 'Adventure')
}))
[BookList]::Find({
param ($b)
$b.PublishDate -gt '1950-01-01'
}).Title
[BookList]::FindAll({
param($b)
$b.Author -match 'Tolkien'
}).Title
[BookList]::Remove($Book)
[BookList]::Books.Title
[BookList]::RemoveBy('Author', 'J.R.R. Tolkien')
"Titles: $([BookList]::Books.Title)"
[BookList]::Add($Book)
[BookList]::Add($Book)
The Fellowship of the Ring
The Hobbit
The Fellowship of the Ring
The Fellowship of the Ring
Titles:
Exception:
Line |
84 | throw "Book '$Book' already in list"
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Book 'The Hobbit by J.R.R. Tolkien (1937)' already in list
Örnek 5 - Runspace benzimi olan ve olmayan sınıf tanımı
ShowRunspaceId()
[UnsafeClass] yöntemi farklı iş parçacığı kimliklerini ancak aynı çalışma alanı kimliğini bildirir. Sonunda, oturum durumu bozuktur ve Global scope cannot be removedgibi bir hataya neden olur.
# Class definition with Runspace affinity (default behavior)
class UnsafeClass {
static [Object] ShowRunspaceId($Val) {
return [pscustomobject]@{
ThreadId = [Threading.Thread]::CurrentThread.ManagedThreadId
RunspaceId = [runspace]::DefaultRunspace.Id
}
}
}
$unsafe = [UnsafeClass]::new()
while ($true) {
1..10 | ForEach-Object -Parallel {
Start-Sleep -ms 100
($Using:unsafe)::ShowRunspaceId($_)
}
}
Not
Bu örnek sonsuz bir döngüde çalışır. Yürütmeyi durdurmak için Ctrl+C girin.
ShowRunspaceId()
[SafeClass] yöntemi farklı iş parçacığı ve Runspace kimliklerini bildirir.
# Class definition with NoRunspaceAffinity attribute
[NoRunspaceAffinity()]
class SafeClass {
static [Object] ShowRunspaceId($Val) {
return [pscustomobject]@{
ThreadId = [Threading.Thread]::CurrentThread.ManagedThreadId
RunspaceId = [runspace]::DefaultRunspace.Id
}
}
}
$safe = [SafeClass]::new()
while ($true) {
1..10 | ForEach-Object -Parallel {
Start-Sleep -ms 100
($Using:safe)::ShowRunspaceId($_)
}
}
Not
Bu örnek sonsuz bir döngüde çalışır. Yürütmeyi durdurmak için Ctrl+C girin.
Sınıf özellikleri
Özellikler, sınıf kapsamında bildirilen değişkenlerdir. Bir özellik herhangi bir yerleşik türde veya başka bir sınıfın bir örneğinde olabilir. Sınıflar sıfır veya daha fazla özelliğe sahip olabilir. Sınıfların özellik sayısı üst sınırı yoktur.
Daha fazla bilgi için bkz. about_Classes_Properties.
Sınıf yöntemleri
Yöntemler, bir sınıfın gerçekleştirebileceği eylemleri tanımlar. Yöntemler, giriş verilerini belirten parametreleri alabilir. Yöntemler her zaman bir çıkış türü tanımlar. Bir yöntem herhangi bir çıkış döndürmezse, Void çıkış türüne sahip olmalıdır. Bir yöntem açıkça bir çıkış türü tanımlamazsa, yöntemin çıkış türü Void olur.
Daha fazla bilgi için bkz. about_Classes_Methods.
Sınıf oluşturucuları
Oluşturucular, sınıfın örneğini oluştururken varsayılan değerleri ayarlamanıza ve nesne mantığını doğrulamanıza olanak tanır. Oluşturucular sınıfıyla aynı ada sahiptir. Oluşturucuların, yeni nesnenin veri üyelerini başlatmak için parametreleri olabilir.
Daha fazla bilgi için bkz. about_Classes_Constructors.
Gizli anahtar sözcük
hidden anahtar sözcüğü bir sınıf üyesini gizler. Üye hala kullanıcı tarafından erişilebilir durumdadır ve nesnenin kullanılabilir olduğu tüm kapsamlarda kullanılabilir.
Gizli üyeler Get-Member cmdlet'inden gizlenir ve sınıf tanımının dışında sekme tamamlama veya IntelliSense kullanılarak görüntülenemez.
hidden anahtar sözcüğü yalnızca sınıf üyeleri için geçerlidir, sınıfın kendisi için geçerli değildir.
Gizli sınıf üyeleri şunlardır:
- Sınıfın varsayılan çıkışına dahil değildir.
-
Get-Membercmdlet'i tarafından döndürülen sınıf üyeleri listesine dahil değildir. gizli üyeleriGet-Memberile göstermek için Zorla parametresini kullanın. - Gizli üyeyi tanımlayan sınıfta tamamlanma gerçekleşmediği sürece sekme tamamlama veya IntelliSense'te görüntülenmez.
- Sınıfın genel üyeleri. Bunlara erişilebilir, devralınabilir ve değiştirilebilir. Bir üyenin gizlenmesi onu özel yapmaz. Yalnızca önceki noktalarda açıklandığı gibi üyeyi gizler.
Not
Bir yöntem için herhangi bir aşırı yüklemeyi gizlediğinizde, bu yöntem IntelliSense'ten, tamamlanma sonuçlarından ve Get-Memberiçin varsayılan çıktıdan kaldırılır.
Herhangi bir oluşturucuyu gizlediğinizde, new() seçeneği IntelliSense ve tamamlama sonuçlarından kaldırılır.
Anahtar sözcük hakkında daha fazla bilgi için bkz. about_Hidden. Gizli özellikler hakkında daha fazla bilgi için bkz. about_Classes_Properties. Gizli yöntemler hakkında daha fazla bilgi için bkz. about_Classes_Methods. Gizli oluşturucular hakkında daha fazla bilgi için bkz. about_Classes_Constructors.
Statik anahtar sözcük
static anahtar sözcüğü, sınıfında var olan ve örneği olmayan bir özelliği veya yöntemi tanımlar.
Statik bir özellik, sınıf örneğinden bağımsız olarak her zaman kullanılabilir. Statik özellik, sınıfın tüm örnekleri arasında paylaşılır. Statik bir yöntem her zaman kullanılabilir. Tüm statik özellikler tüm oturum süresi boyunca etkindir.
static anahtar sözcüğü yalnızca sınıf üyeleri için geçerlidir, sınıfın kendisi için geçerli değildir.
Statik özellikler hakkında daha fazla bilgi için bkz. about_Classes_Properties. Statik yöntemler hakkında daha fazla bilgi için bkz. about_Classes_Methods. Statik oluşturucular hakkında daha fazla bilgi için bkz. about_Classes_Constructors.
PowerShell sınıflarında devralma
Varolan bir sınıftan türetilen yeni bir sınıf oluşturarak bir sınıfı genişletebilirsiniz. Türetilmiş sınıf, temel sınıfın özelliklerini ve yöntemlerini devralır. Temel sınıf üyelerini gerektiği gibi ekleyebilir veya geçersiz kılabilirsiniz.
PowerShell birden çok devralmayı desteklemez. Sınıflar doğrudan birden fazla sınıftan devralamaz.
Sınıflar, bir sözleşme tanımlayan arabirimlerden de devralabilir. Bir arabirimden devralan bir sınıfın bu sözleşmeyi uygulaması gerekir. Bunu yaptığı zaman sınıfı, bu arabirimi uygulayan diğer tüm sınıflar gibi kullanılabilir.
Temel sınıftan devralan veya arabirimler uygulayan sınıfları türetme hakkında daha fazla bilgi için bkz. about_Classes_Inheritance.
NoRunspaceAffinity özniteliği
Çalışma alanı, PowerShell tarafından çağrılan komutların işletim ortamıdır. Bu ortam, şu anda mevcut olan komutları ve verileri ve geçerli olan tüm dil kısıtlamalarını içerir.
PowerShell sınıfı varsayılan olarak oluşturulduğu Runspace ile ilişkilidir.
ForEach-Object -Parallel'da PowerShell sınıfı kullanmak güvenli değildir.
Sınıfındaki yöntem çağrıları, oluşturulduğu Runspace geri sıralanır ve bu da Runspace durumunu bozabilir veya kilitlenmeye neden olabilir.
NoRunspaceAffinity özniteliğini sınıf tanımına eklemek, PowerShell sınıfının belirli bir çalışma alanıyla ilişkili olmamasını sağlar. Hem örnek hem de statik yöntem çağrıları, çalışan iş parçacığının ve iş parçacığının geçerli oturum durumunun Runspace kullanır.
Özniteliği PowerShell 7.4'e eklendi.
Özniteliği olan ve olmayan sınıflar için davranış farkını NoRunspaceAffinity gösteren bir çizim için bkz . Örnek 5.
Tür hızlandırıcıları ile sınıfları dışarı aktarma
Varsayılan olarak, PowerShell modülleri PowerShell'de tanımlanan sınıfları ve numaralandırmaları otomatik olarak dışarı aktarmaz. Özel türler, using module deyimi çağrılmadan modülün dışında kullanılamaz.
Ancak, bir modül tür hızlandırıcıları eklerse, kullanıcılar modülü içeri aktardıktan sonra bu tür hızlandırıcıları oturumda hemen kullanılabilir.
Not
Oturuma tür hızlandırıcıları eklemek için iç (genel değil) API kullanılır. Bu API'nin kullanılması çakışmalara neden olabilir. Aşağıda açıklanan desen, modülü içeri aktardığınızda aynı ada sahip bir tür hızlandırıcısı zaten varsa hata oluşturur. Ayrıca modülü oturumdan kaldırdığınızda tür hızlandırıcılarını da kaldırır.
Bu düzen, türlerin bir oturumda kullanılabilir olmasını sağlar. VS Code'da bir betik dosyası yazılırken IntelliSense'i veya tamamlanmayı etkilemez.
VS Code'daki özel türler için IntelliSense ve tamamlama önerileri almak için betiğin en üstüne bir using module deyimi eklemeniz gerekir.
Aşağıdaki desen, PowerShell sınıflarını ve numaralandırmalarını bir modülde tür hızlandırıcıları olarak nasıl kaydedebileceğinizi gösterir. Kod parçacığını herhangi bir tür tanımından sonra kök betik modülüne ekleyin.
$ExportableTypes değişkeninin, modülü içeri aktardığında kullanıcıların kullanımına açmak istediğiniz türlerin her birini içerdiğinden emin olun. Diğer kod herhangi bir düzenleme gerektirmez.
# Define the types to export with type accelerators.
$ExportableTypes =@(
[DefinedTypeName]
)
# Get the internal TypeAccelerators class to use its static methods.
$TypeAcceleratorsClass = [psobject].Assembly.GetType(
'System.Management.Automation.TypeAccelerators'
)
# Ensure none of the types would clobber an existing type accelerator.
# If a type accelerator with the same name exists, throw an exception.
$ExistingTypeAccelerators = $TypeAcceleratorsClass::Get
foreach ($Type in $ExportableTypes) {
if ($Type.FullName -in $ExistingTypeAccelerators.Keys) {
$Message = @(
"Unable to register type accelerator '$($Type.FullName)'"
'Accelerator already exists.'
) -join ' - '
throw [System.Management.Automation.ErrorRecord]::new(
[System.InvalidOperationException]::new($Message),
'TypeAcceleratorAlreadyExists',
[System.Management.Automation.ErrorCategory]::InvalidOperation,
$Type.FullName
)
}
}
# Add type accelerators for every exportable type.
foreach ($Type in $ExportableTypes) {
$TypeAcceleratorsClass::Add($Type.FullName, $Type)
}
# Remove type accelerators when the module is removed.
$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = {
foreach($Type in $ExportableTypes) {
$TypeAcceleratorsClass::Remove($Type.FullName)
}
}.GetNewClosure()
Kullanıcılar modülü içeri aktardığında, oturum için tür hızlandırıcılarına eklenen tüm türler IntelliSense ve tamamlama için hemen kullanılabilir. Modül kaldırıldığında tür hızlandırıcıları da kaldırılır.
PowerShell modülünden sınıfları el ile içeri aktarma
Import-Module ve #Requires deyimi yalnızca modül tarafından tanımlanan modül işlevlerini, diğer adlarını ve değişkenleri içeri aktarır. Sınıflar içeri aktarılamaz.
Bir modül sınıfları ve numaralandırmaları tanımlar ancak bu türler için tür hızlandırıcıları eklemezse, bunları içeri aktarmak için using module deyimini kullanın.
using module deyimi, bir betik modülünün veya ikili modülün kök modülünden (ModuleToProcess) sınıfları ve numaralandırmaları içeri aktarır. İç içe modüllerde tanımlanan sınıfları veya kök modüle nokta kaynaklı betiklerde tanımlanan sınıfları tutarlı bir şekilde içeri aktarmaz. Doğrudan kök modülde modülün dışındaki kullanıcıların kullanımına sunulmasını istediğiniz sınıfları tanımlayın.
using deyimi hakkında daha fazla bilgi için bkz. about_Using.
Geliştirme sırasında yeni değiştirilen kodu yükleme
Bir betik modülünün geliştirilmesi sırasında kodda değişiklik yapmak ve ardından Import-Module parametresiyle kullanarak modülün yeni sürümünü yüklemek yaygın bir işlemdir. Modülü yeniden yüklemek yalnızca kök modüldeki işlevlerde yapılan değişiklikler için çalışır.
Import-Module iç içe modülleri yeniden yüklemez. Ayrıca, güncelleştirilmiş sınıfları yüklemenin hiçbir yolu yoktur.
En son sürümü çalıştırdığınızdan emin olmak için yeni bir oturum başlatmanız gerekir.
PowerShell'de tanımlanan ve using deyimiyle içeri aktarılan sınıflar ve numaralandırmalar kaldırılamaz.
Bir diğer yaygın geliştirme uygulaması da kodunuzu farklı dosyalara ayırmaktır. Başka bir modülde tanımlanan sınıfları kullanan bir dosyada işleviniz varsa, işlevlerin gerekli sınıf tanımlarına sahip olduğundan emin olmak için using module deyimini kullanmanız gerekir.
PSReference türü sınıf üyeleriyle desteklenmez
[ref] tür hızlandırıcısı, PSReference sınıfı için kısaltmadır. Sınıf üyesini tür atama için [ref] kullanma sessizce başarısız olur.
[ref] parametreleri kullanan API'ler sınıf üyeleriyle kullanılamaz.
PSReference sınıfı, COM nesnelerini destekleyecek şekilde tasarlanmıştır. COM nesneleri, başvuruya göre bir değer geçirmeniz gereken durumlara sahiptir.
Daha fazla bilgi için bkz. PSReference Sınıfı.
Sınırlamalar
Aşağıdaki listeler, PowerShell sınıflarını tanımlamaya yönelik sınırlamaları ve varsa bu sınırlamalar için geçici çözümü içerir.
Genel sınırlamalar
Sınıf üyeleri, türleri olarak PSReference kullanamaz.
Geçici çözüm: Yok.
PowerShell sınıfları bir oturumda kaldırılamaz veya yeniden yüklenemez.
Geçici çözüm: Yeni bir oturum başlatın.
Modülde tanımlanan PowerShell sınıfları otomatik olarak içeri aktarılamaz.
Geçici çözüm: Tanımlanan türleri kök modüldeki tür hızlandırıcıları listesine ekleyin. Bu, türleri modül içeri aktarma işleminde kullanılabilir hale getirir.
hiddenvestaticanahtar sözcükleri bir sınıf tanımı için değil yalnızca sınıf üyeleri için geçerlidir.Geçici çözüm: Yok.
Varsayılan olarak, PowerShell sınıflarının çalışma alanları arasında paralel yürütmede kullanılması güvenli değildir. Bir sınıfta yöntemleri çağırdığınızda PowerShell çağrıları sınıfın oluşturulduğu Runspace yeniden sıralar ve bu da Runspace durumunu bozabilir veya kilitlenmeye neden olabilir.
Geçici çözüm: sınıf bildirimine
NoRunspaceAffinityözniteliğini ekleyin.
Oluşturucu sınırlamaları
Oluşturucu zincirleme uygulanmaz.
Geçici çözüm: Gizli
Init()yöntemlerini tanımlayın ve oluşturucuların içinden bunları çağırın.Oluşturucu parametreleri doğrulama öznitelikleri de dahil olmak üzere herhangi bir özniteliği kullanamaz.
Geçici çözüm: Oluşturucu gövdesindeki parametreleri doğrulama özniteliğiyle yeniden atayın.
Oluşturucu parametreleri varsayılan değerleri tanımlayamaz. Parametreler her zaman zorunlu olmalıdır.
Geçici çözüm: Yok.
Bir oluşturucunun herhangi bir aşırı yüklemesi gizliyse, oluşturucu için her aşırı yükleme de gizli olarak değerlendirilir.
Geçici çözüm: Yok.
Yöntem sınırlamaları
Yöntem parametreleri doğrulama öznitelikleri de dahil olmak üzere herhangi bir özniteliği kullanamaz.
Geçici çözüm: Yöntem gövdesindeki parametreleri doğrulama özniteliğiyle yeniden atayın veya
Update-TypeDatacmdlet'iyle statik oluşturucuda yöntemini tanımlayın.Yöntem parametreleri varsayılan değerleri tanımlayamaz. Parametreler her zaman zorunlu olmalıdır.
Geçici çözüm:
Update-TypeDatacmdlet'iyle statik oluşturucuda yöntemini tanımlayın.Yöntemler gizli olsalar bile her zaman geneldir. Sınıf devralındığında bunlar geçersiz kılınabilir.
Geçici çözüm: Yok.
Bir yöntemin herhangi bir aşırı yüklemesi gizlenirse, bu yöntemin her aşırı yüklemesi de gizli olarak değerlendirilir.
Geçici çözüm: Yok.
Özellik sınırlamaları
Statik özellikler her zaman değişebilir. PowerShell sınıfları sabit statik özellikleri tanımlayamaz.
Geçici çözüm: Yok.
Sınıf özelliği öznitelik bağımsız değişkenlerinin sabit olması gerektiğinden özellikler ValidateScript özniteliğini kullanamaz.
Geçici çözüm: ValidateArgumentsAttribute türünden devralan bir sınıf tanımlayın ve bunun yerine bu özniteliği kullanın.
Doğrudan bildirilen özellikler özel alıcı ve ayarlayıcı uygulamaları tanımlayamaz.
Geçici çözüm: Gizli bir özellik tanımlayın ve görünür alıcı ve ayarlayıcı mantığını tanımlamak için
Update-TypeDatakullanın.Özellikler Diğer Ad özniteliğini kullanamaz. özniteliği yalnızca parametreler, cmdlet'ler ve işlevler için geçerlidir.
Geçici çözüm: Sınıf oluşturucularında diğer adları tanımlamak için
Update-TypeDatacmdlet'ini kullanın.PowerShell sınıfı
ConvertTo-Jsoncmdlet'i ile JSON'a dönüştürüldüğünde, çıktı JSON tüm gizli özellikleri ve değerlerini içerir.Geçici çözüm: Yok
Devralma sınırlamaları
PowerShell, betik kodunda arabirim tanımlamayı desteklemez.
Geçici çözüm: C# dilinde arabirimleri tanımlayın ve arabirimleri tanımlayan derlemeye başvurun.
PowerShell sınıfları yalnızca bir temel sınıftan devralabilir.
Geçici çözüm: Sınıf devralma geçişli. Türetilmiş bir sınıf, temel sınıfın özelliklerini ve yöntemlerini almak için başka bir türetilmiş sınıftan devralabilir.
Genel bir sınıftan veya arabirimden devralırken, genel için tür parametresinin zaten tanımlanmış olması gerekir. Sınıf kendisini bir sınıf veya arabirim için tür parametresi olarak tanımlayamaz.
Geçici çözüm: Genel bir temel sınıftan veya arabirimden türetmek için özel türü farklı bir
.psm1dosyasında tanımlayın ve türü yüklemek içinusing moduledeyimini kullanın. Bir özel türün genel bir türden devralırken tür parametresi olarak kendisini kullanması için geçici bir çözüm yoktur.
Ayrıca bakınız
PowerShell