11. Modüller

Editoryal notu

Önemli

Windows PowerShell Dil Belirtimi 3.0 Aralık 2012'de yayımlanmıştır ve Windows PowerShell 3.0'ı temel alır. Bu belirtim PowerShell'in geçerli durumunu yansıtmaz. Bu belgeleri geçerli durumu yansıtacak şekilde güncelleştirme planı yoktur. Bu belgeler, geçmişe yönelik başvuru için burada sunulmuştur.

Belirtim belgesi, Şu konumdaki Microsoft İndirme Merkezi'nden bir Microsoft Word belgesi olarak kullanılabilir: https://www.microsoft.com/download/details.aspx?id=36389 Bu Word belgesi burada Microsoft Learn'de sunu için dönüştürülmüştür. Dönüştürme sırasında, Docs platformu için biçimlendirmeye uyum sağlamak için bazı editoryal değişiklikler yapılmıştır. Bazı yazım hataları ve küçük hatalar düzeltildi.

11.1 Giriş

§3.14'de belirtildiği gibi modül, PowerShell kodunun bölümlendirilmesine, düzenlenmesine ve soyutlanmasına olanak tanıyan kendi kendine yeniden kullanılabilir bir birimdir. Modül, komutları (cmdlet'ler ve işlevler gibi) ve öğeleri (değişkenler ve diğer adlar gibi) içerenbir veya daha fazla modül üyesi içerebilir. Bu üyelerin adları modülde özel tutulabilir veya modülün ihraç edildiği oturuma aktarılabilir.

için üç farklı modül türü vardır: manifest, betik ve ikili. bildirim modülü, modül hakkında bilgi içeren ve bu modülün kullanımının belirli yönlerini denetleen bir dosyadır. betik modülü, .psm1yerine .ps1 dosya uzantısına sahip bir PowerShell betik dosyasıdır. ikili modülü cmdlet'leri ve sağlayıcıları tanımlayan sınıf türlerini içerir. Betik modüllerinden farklı olarak, ikili modüller derlenmiş dillerde yazılır. İkili modüller bu belirtim kapsamında değildir.

İkili modül, PowerShell kitaplıklarına karşı derlenmiş bir .NET derlemesidir (örn. DLL).

Modüller iç içe geçebilir; diğer bir ifadeyle, bir modül başka bir modülü içeri aktarabilir. İlişkili iç içe modülleri olan bir modül, bir kök modüldür.

PowerShell oturumu oluşturulduğunda, varsayılan olarak hiçbir modül içeri aktarılır.

Modüller içeri aktarıldığında, bunları bulmak için kullanılan arama yolu PSModulePathortam değişkeni tarafından tanımlanır.

Aşağıdaki cmdlet'ler modüllerle ilgilenir:

11.2 Betik Modülü Yazma

Betik modülü bir betik dosyasıdır. Aşağıdaki betik modülünü göz önünde bulundurun:

function Convert-CentigradeToFahrenheit ([double]$tempC) {
    return ($tempC * (9.0 / 5.0)) + 32.0
}
New-Alias c2f Convert-CentigradeToFahrenheit

function Convert-FahrenheitToCentigrade ([double]$tempF) {
    return ($tempF - 32.0) * (5.0 / 9.0)
}
New-Alias f2c Convert-FahrenheitToCentigrade

Export-ModuleMember -Function Convert-CentigradeToFahrenheit
Export-ModuleMember -Function Convert-FahrenheitToCentigrade
Export-ModuleMember -Alias c2f, f2c

Bu modülde her birinin diğer adı olan iki işlev bulunur. Varsayılan olarak, tüm işlev adları ve yalnızca işlev adları dışarı aktarılır. Ancak, herhangi bir şeyi dışarı aktarmak için cmdlet Export-ModuleMember kullanıldığında, yalnızca açıkça dışarı aktarılanlar dışarı aktarılır. Bir dizi komut ve öğe bu cmdlet'e tek bir çağrıda veya bir dizi çağrıda dışarı aktarılabilir; bu tür çağrılar geçerli oturum için birikmelidir.

11.3 Betik modülü yükleme

Betik modülü bir betik dosyasında tanımlanır ve modüller herhangi bir dizinde depolanabilir. PSModulePath ortam değişkeni, modülle ilgili cmdlet'ler adları tam yol içermeyen modülleri ararken aranacak bir dizin kümesine işaret eder. Ek arama yolları sağlanabilir; mesela

$Env:PSModulePath = $Env:PSModulePath + ";<additional-path>"

Eklenen tüm ek yollar yalnızca geçerli oturumu etkiler.

Alternatif olarak, bir modül içeri aktarıldığında tam nitelikli yol belirtilebilir.

11.4 Betik modülünü içeri aktarma

Modüldeki kaynakların kullanılabilmesi için önce bu modülün cmdlet'i Import-Modulekullanılarak geçerli oturuma aktarılması gerekir. Import-Module, içeri aktarmış olduğu kaynakları kısıtlayabilir.

Bir modül içeri aktarıldığında betik dosyası yürütülür. Bu işlem, betik dosyasında bir veya daha fazla parametre tanımlanarak ve Import-ModuleArgumentList parametresi aracılığıyla karşılık gelen bağımsız değişkenler geçirilerek yapılandırılabilir.

§11.2'de tanımlanan bu işlevleri ve diğer adları kullanan aşağıdaki betiği göz önünde bulundurun:

Import-Module "E:\Scripts\Modules\PSTest_Temperature" -Verbose

"0 degrees C is " + (Convert-CentigradeToFahrenheit 0) + " degrees F"
"100 degrees C is " + (c2f 100) + " degrees F"
"32 degrees F is " + (Convert-FahrenheitToCentigrade 32) + " degrees C"
"212 degrees F is " + (f2c 212) + " degrees C"

Modülü içeri aktarmak, modüldeki komutlar veya öğeler oturumdaki komutlar veya öğelerle aynı adlara sahip olduğunda ad çakışması oluşturur. Ad çakışması, bir adın gizlenmesini veya değiştirilmesini neden olur. adlandırma çakışmalarını önlemek için Import-Module Prefix parametresi kullanılabilir. Ayrıca, Takma Ad, Cmdlet, Fonksiyonve Değişken parametreleri, içeri aktarılacak komut seçimini sınırlayarak ad çakışması olasılığını azaltabilir.

Bir komut gizli olsa bile, adını kaynağı olduğu modülün adıyla niteleyerek çalıştırılabilir. Örneğin, Mmodülünde F işlevini çağırır ve 100 argümanını geçirir.

Oturum aynı ada sahip aynı türde komutlar (aynı ada sahip iki cmdlet gibi) içerdiğinde, varsayılan olarak en son eklenen komutu çalıştırır.

Modüllerle ilgili kapsam tartışması için bkz. §3.5.6.

11.5 Betik modülünü kaldırma

bir veya daha fazla modül Remove-Modulecmdlet'i aracılığıyla bir oturumdan kaldırılabilir.

Bir modülün kaldırılması, modülün kaldırıldığı anlamına gelmez.

Betik modülünde, modülün kaldırılmasından önce yürütülecek kodu aşağıdaki gibi belirtmek mümkündür:

$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = { *on-removal-code* }

11.6 Modül bildirimleri

§11.1'de belirtildiği gibi bildirim modülü, modül hakkında bilgi içeren ve bu modülün kullanımının belirli yönlerini denetleen bir dosyadır.

Modülün karşılık gelen bir bildirimi olması gerekmez, ancak varsa, bu bildirim tanımladığı modülle aynı ada sahiptir, ancak .psd1 bir dosya uzantısına sahiptir.

Bildirim, powershell betiğinin sınırlı bir alt kümesini içerir ve bir dizi anahtar içeren bir Hashtable döndürür. Bu anahtarlar ve değerleri, bu modül için bildirim öğelerini belirtir. Diğer bir ifadeyle modülün içeriğini ve özniteliklerini açıklar, önkoşulları tanımlar ve bileşenlerin nasıl işleneceğini belirler.

Temelde, bildirim bir veri dosyasıdır; ancak veri türlerine, if deyimine ve aritmetik ve karşılaştırma işleçlerine başvurular içerebilir. (Atamalara, işlev tanımlarına ve döngülere izin verilmez.) Bir bildirimin ortam değişkenlerine okuma erişimi de vardır ve cmdlet Join-Pathçağrıları içerebilir, böylece yollar oluşturulabilir.

Not

Düzenleyicinin Notu: Özgün belge, modül bildirim dosyasında izin verilen anahtarların listesini içerir. Bu liste güncel değil ve tamamlanmamış. Modül bildirimindeki anahtarların tam listesi için bkz. New-ModuleManifest.

Gereken tek anahtar ModuleVersion'dır.

Basit bir bildirim örneği aşağıda verilmiştir:

@{
ModuleVersion = '1.0'
Author = 'John Doe'
RequiredModules = @()
FunctionsToExport = 'Set*','Get*','Process*'
}

GUID anahtarının bir string değeri vardır. Bu, modül için Genel Benzersiz Kimlik Belirleyicisi 'ni (GUID) belirtir. GUID, aynı ada sahip modülleri ayırt etmek için kullanılabilir. Yeni bir GUID oluşturmak için [guid]::NewGuid()yöntemini çağırın.

11.7 Dinamik modüller

dinamik modül, cmdlet New-Moduletarafından çalışma zamanında bellekte oluşturulan bir modüldür; diskten yüklenmez. Aşağıdaki örneği göz önünde bulundurun:

$sb = {
    function Convert-CentigradeToFahrenheit ([double]$tempC) {
        return ($tempC * (9.0 / 5.0)) + 32.0
    }

    New-Alias c2f Convert-CentigradeToFahrenheit

    function Convert-FahrenheitToCentigrade ([double]$tempF) {
        return ($tempF - 32.0) * (5.0 / 9.0)
    }

    New-Alias f2c Convert-FahrenheitToCentigrade

    Export-ModuleMember -Function Convert-CentigradeToFahrenheit
    Export-ModuleMember -Function Convert-FahrenheitToCentigrade
    Export-ModuleMember -Alias c2f, f2c
}

New-Module -Name MyDynMod -ScriptBlock $sb
Convert-CentigradeToFahrenheit 100
c2f 100

Betik bloğu $sb modülün içeriğini tanımlar( bu örnekte, bu işlevler için iki işlev ve iki diğer ad). Disk üzerindeki modülde olduğu gibi, varsayılan olarak yalnızca işlevler dışarı aktarılır, bu nedenle hem işlevleri hem de diğer adları dışarı aktarmak için Export-ModuleMember cmdlet çağrıları vardır.

New-Module çalıştırıldıktan sonra, dışarı aktarılan dört ad, Convert-CentigradeToFahrenheit ve c2f çağrıları tarafından gösterildiği gibi oturumda kullanılabilir.

Tüm modüllerde olduğu gibi dinamik modüllerin üyeleri de genel kapsamın alt öğesi olan özel bir modül kapsamında çalışır. Get-Module dinamik modül alamaz, ancak Get-Command dışarı aktarılan üyeleri alabilir.

Dinamik modülü Get-Moduleiçin kullanılabilir hale getirmek amacıyla, New-Module komutunu Import-Module'ye iletin veya New-Module'ün döndürdüğü modül nesnesini Import-Module'e iletin. Bu eylem, dinamik modülü Get-Module listesine ekler, ancak modülü diske kaydetmez veya kalıcı hale getirmez.

11.8 Kapanışlar

Dinamik bir modül, veri ekli bir fonksiyon olan kapanışıoluşturmak için kullanılabilir. Aşağıdaki örneği göz önünde bulundurun:

function Get-NextID ([int]$StartValue = 1) {
    $nextID = $StartValue
    {
        ($Script:nextID++)
    }.GetNewClosure()
}

$v1 = Get-NextID      # get a scriptblock with $StartValue of 0
& $v1                 # invoke Get-NextID getting back 1
& $v1                 # invoke Get-NextID getting back 2

$v2 = Get-NextID 100  # get a scriptblock with $StartValue of 100
& $v2                 # invoke Get-NextID getting back 100
& $v2                 # invoke Get-NextID getting back 101

Buradaki amaç, Get-NextID başlangıç değeri belirtilebilen bir dizide sonraki kimliği döndürmektir. Ancak, her biri kendi $StartValue ve $nextID bağlamı olan birden çok dizi desteklenmelidir. Bu, [scriptblock]::GetNewClosure yöntemine (§4.3.7) çağrısıyla elde edilir.

GetNewClosuretarafından her yeni kapanış oluşturulduğunda yeni bir dinamik modül oluşturulur ve çağıranın kapsamındaki değişkenler (bu örnekte, artışı içeren betik bloğu) bu yeni modüle kopyalanır. Üst işlevin içinde tanımlanan nextId değerinin (ancak betik bloğunun dışında) artırıldığından emin olmak için, açık Betik: kapsam ön eki gereklidir.

Mesela, betik bloğunun adlandırılmış bir işlev olması gerekmez:

$v3 = & {      # get a scriptblock with $StartValue of 200
    param ([int]$StartValue = 1)
    $nextID = $StartValue
    {
        ($Script:nextID++)
    }.GetNewClosure()
} 200

& $v3          # invoke script getting back 200
& $v3          # invoke script getting back 201