11. modüller

11,1 giriş

§ 3,14' de belirtildiği gibi, bir modül, PowerShell kodunun bölümlenmesi, düzenlenmesine ve soyutlanmalarına olanak sağlayan, kendi içinde bulunan bir yeniden kullanılabilir birimdir. Modül, komutlar (cmdlet 'ler ve işlevler gibi) ve öğeler (değişkenler ve diğer adlar gibi) olan bir veya daha fazla Modül üyesini içerebilir. Bu üyelerin adları, modüle özel olarak tutulabilir veya modülün içeri aktarıldığı oturuma aktarılabilir .

Üç farklı Modül türü vardır: manifest, SCRIPT ve binary. Bildirim modülü , bir modülle ilgili bilgileri içeren bir dosyadır ve bu modülün kullanım özelliklerini denetler. Betik modülü , yerine .ps1 bir dosya uzantısına .psm1 sahip bir PowerShell betik dosyasıdır. İkili 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 göre derlenen bir .NET derlemesidir (yani, bir DLL).

Modüller iç içe çıkabilir; diğer bir deyişle, bir modül başka bir modül içeri aktarabilir. İlişkili iç içe geçmiş modüller içeren bir modül kök modülüdür.

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

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

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

11,2 betik modülünü yazma

Betik modülü bir komut 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ül, her birinin bir diğer adına sahip iki işlev içerir. Varsayılan olarak, tüm işlev adları ve yalnızca işlev adları verilir. Bununla birlikte, cmdlet Export-ModuleMember bir şeyi dışarı aktarmak için kullanıldığında, yalnızca açıkça dışarı aktarılmış olan şeyler dışarı aktaralınacaktır. Bir dizi komut ve öğe, bu cmdlet 'e bir çağrıda veya bir çağrı sayısında aktarılabilir; Bu tür çağrılar geçerli oturum için birikimlidir.

11,3 betik modülünü 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üllerle ilgili cmdlet 'ler, adları tam olarak nitelenmiş bir yol içermeyen modüller için arama yaparken aranacak bir dizin kümesini işaret eder. Ek arama yolları belirtilebilir; Örneğin,

$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 nitelenmiş bir yol belirtilebilir.

11,4 komut dosyası modülünü içeri aktarma

Bir modüldeki kaynakların kullanılabilmesi için, Bu modülün cmdlet 'i Import-Module kullanılarak geçerli oturuma aktarılması gerekir. Import-Module gerçekte içeri aktardığı kaynakları kısıtlayabilir.

Bir modül içeri aktarıldığında, komut dosyası yürütülür. Bu işlem, betik dosyasında bir veya daha fazla parametre tanımlayarak ve bağımsız değişkenlerin bağımsız değişken listesi parametresi Import-Module aracılığıyla 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 _ sıcaklık"-ayrıntılı

"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ün içeri aktarılması, Modüldeki komutlar veya öğeler oturumdaki komutlarla veya öğelerle aynı ada sahip olduğunda ad çakışmasına neden olur. Ad çakışması, bir adın gizlenmekte veya değiştirilmesine neden olur. ' Nin Import-Module önek parametresi, adlandırma çakışmalarını önlemek için kullanılabilir. Ayrıca, diğer ad, cmdlet, işlev ve değişken parametreleri içeri aktarılacak komut seçimini sınırlayabilir ve bu sayede ad çakışması olasılığını azaltır.

Bir komut gizli olsa bile, adının kaynaklandığı modülün adıyla niteleyerek çalıştırılabilir. Örneğin, & M\F 100 d modülünde F işlevini çağırır ve 100 bağımsız değişkenine geçirir.

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

Modüllerle ilişkili olarak kapsam tartışması için bkz. § 3.5.6 .

11,5 betik modülünü kaldırma

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

Modülün kaldırılması modülü kaldırmaz.

Bir komut dosyası modülünde, Bu modülün kaldırılması öncesinde 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ü bir modülle ilgili bilgileri içeren bir dosyadır ve bu modülün kullanım özelliklerini denetler.

Modülün karşılık gelen bir bildirimi olması gerekir, ancak bu bildirim, açıkladığı modülle aynı ada sahip ancak bir .psd1 dosya uzantısıyla aynı ada sahip.

Bir bildirim, bir anahtarlar kümesi içeren bir Hashtable döndüren PowerShell betiğinin sınırlı bir alt kümesini içerir. Bu anahtarlar ve değerleri bu modülle ilgili bildirim öğelerini belirtir. Diğer bir deyişle, modülün içeriğini ve özniteliklerini tanımlar, herhangi bir önkoşulları tanımlar ve bileşenlerin nasıl işlendiğini belirler.

Temel olarak, bildirim bir veri dosyasıdır; Ancak, veri türlerine, if ifadesine ve aritmetik ve karşılaştırma işleçlerine başvuru içerebilir. (Atamalara, işlev tanımlarına ve döngülere izin verilmez.) Ayrıca, bir bildirimin ortam değişkenlerine okuma erişimi vardır ve cmdlet Join-Path 'e çağrılar içerebilir, bu nedenle yollar oluşturulabilir.

Not

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

Gerekli tek anahtar Moduleversion' dir.

Basit bildirime bir örnek aşağıda verilmiştir:

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

Anahtar GUID 'sinin bir string değeri vardır. Bu, modül için bir genel benzersiz tanımlayıcı (GUID) belirtir. GUID , aynı ada sahip modüller arasında ayrım yapmak için kullanılabilir. Yeni bir GUID oluşturmak için yöntemini [guid]::NewGuid() çağırın.

11,7 Dinamik modüller

Dinamik modül , cmdlet New-Module 'in çalışma zamanında bellekte oluşturulmuş bir modüldür; diskten yüklenmez. Aşağıdaki örneği inceleyin:

$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

Komut dosyası bloğu $sb modülün içeriğini tanımlar, bu durumda iki işlev ve bu işlevlere iki diğer ad. Disk üzerindeki modülde olduğu gibi, varsayılan olarak yalnızca işlevler dışarı aktarılabilir, bu nedenle Export-ModuleMember cmdlet 'ler, hem işlevleri hem de diğer adları dışarı aktarmak için mevcut.

Bir kez New-Module çalıştıktan sonra, ve C2F çağrılarında Convert-CentigradeToFahrenheit gösterildiği gibi, verilen dört ad oturumda kullanılabilir.

Tüm modüller gibi, dinamik modüllerin üyeleri genel kapsamın bir alt öğesi olan özel bir modül kapsamında çalışır. Get-Module dinamik bir modül alınamıyor, ancak Get-Command dışarıya aktarılmış Üyeler alabilir.

Dinamik bir modülün kullanılabilir Get-Module olmasını sağlamak için, bir komutu Import-Module ' a New-Module veya döndüren Import-Module module nesnesini New-Module kanal haline getirin. Bu eylem, dinamik modülü Get-Module listeye ekler, ancak modülü diske kaydetmez veya kalıcı hale getirir.

11,8 kapanışları

Dinamik bir modül, ekli verileri olan bir işlev olan bir Kapanış oluşturmak için kullanılabilir. Aşağıdaki örneği inceleyin:

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 1

$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 Get-NextID Amaç, bir sonrakı kimliği başlangıç değeri belirtime bir dizide döndürmelidir. Ancak, her biri kendi $startValue ve $nextID bağlamı ile birden çok sıra desteklenmelidir. Bu, yöntemi [scriptblock]::GetNewClosure çağrısıyla elde edilir (§ 4.3.7).

Tarafından GetNewClosure Yeni bir kapanış oluşturulduğunda yeni bir dinamik modül oluşturulur ve çağıranın kapsamındaki değişkenler (Bu durumda, artışı içeren betik bloğu) bu yeni modüle kopyalanır. Üst işlevin içinde tanımlanan (ancak komut dosyası bloğunun dışında) NextID 'nin artdiğinden emin olmak için açık betik: kapsam ön eki gereklidir.

Tabii ki, betik bloğunun adlandırılmış bir işlev olması gerekmez; Örneğin:

$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