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:
- Get-Module: veya içeri aktarılabilecek modülleri tanımlar
- Import-Module: geçerli oturuma bir veya daha fazla modül ekler (bkz. § 11,4)
- Export-Modülemeoda: dışarı aktarılacak modül üyelerini tanımlar
- Remove-Module: geçerli oturumdan bir veya daha fazla modülü kaldırır (bkz. § 11,5)
- New-Module: dinamik bir modül oluşturur (bkz. § 11,7)
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
Geri Bildirim
Gönderin ve geri bildirimi görüntüleyin