PowerShell Modüllerini Anlamak ve Oluşturmak
PowerShell modülleriyle çalışmak PowerShell otomasyonunun önemli bir parçasıdır. PowerShell'i öğrenmeye başladığınızda ilk adımlar genellikle tek komutların kullanılmasıdır. Bu, komut dosyalarının oluşturulmasına ve daha sonra işlevlerin oluşturulmasına yol açar.
İşlevleri kullanarak komut dosyalarınızı daha modüler hale getirebilirsiniz. Bu, her yere kod kopyalayıp yapıştırmadan aynı kodu birçok yerde kullanabilmenizi sağlar. İşlevleri kullanmak, kullanıldığı her yerde aynı kodda aynı düzenlemeyi yapmak için daha az zaman harcamanıza olanak tanır. Bunun yerine tek bir yerde kodunuzu daha iyi hale getirmeye çalışabilirsiniz.
İşlevleri bir sonraki seviyeye taşımak için bu işlevleri bir modülde birleştirebilirsiniz.
Modül, psm1 uzantılı bir metin dosyasındaki işlevler topluluğudur. Ayrıca eklenebilecek modül bildirimi ve yoruma dayalı veya harici yardım gibi bazı isteğe bağlı eklemeler de vardır. Bunlar daha sonra ele alınacaktır.
Önkoşullar
Bu yazıda Windows PowerShell 5.1 kullanacağım. Daha eski bir sürüm veya PowerShell Core kullanıyorsanız kat edeceğiniz mesafe, gördüğünüz sonuçlara göre değişiklik gösterebilir.
Modüllerle Etkileşim Kurma
PowerShell oturumunu ilk açtığınızda iki modülle başlayacaksınız. Bunlardan ilki, halihazırda kullandığınız birçok temel PowerShell işlevini içeren Microsoft.PowerShell.Utility'dir. Diğer modül PSReadline'dir. Bu başlangıç modüllerini Get-Module komutunu kullanarak görebilirsiniz.
Bununla birlikte, bu mevcut tüm modüllerin tam listesi değildir. PowerShell 3'ten bu yana yüklenen modüller ihtiyaç duyuldukça içe aktarılacak. PowerShell'in daha eski bir sürümünü çalıştırıyorsanız, komutlardan herhangi birini kullanmadan önce modülü içe aktarmak için Import-Module komutunu kullanmanız gerekecektir.
Daha sonraki sürümlerde bile Import-Module'u kullanmak isteyeceğiniz zamanlar vardır. Bir modülü zaten kurulduktan sonra içe aktarmak istiyorsanız Import-Module'u şu şekilde kullanabilirsiniz:
Get-Module içe aktarılan tüm modülleri gösterirken, henüz içe aktarılmamış modülleri görmezsiniz. Daha sonra mevcut tüm diğer modülleri göstermek için ListAvailable parametresini kullanabilirsiniz.
Tüm Komutlar Varsayılan Olarak Gösterilmiyor
ExportedCommands özelliği, modülden dışa aktarılan tüm mevcut komutların bir listesini içerir. Bu liste ile modül dosyasındakiler arasında bazı farklılıklar görebilirsiniz. Dışa aktarılan komutlar, yazarın bir işlevi gizli olarak bırakmasına olanak tanıyan, modül bildiriminde yerleşik bir özelliktir. Modül yazarları ayrıca Export-ModuleMember cmdlet'ini de kullanabilirler ancak bu, bu makalenin kapsamı dışındadır.
Modül yazarları, kullanıcıya yönelik olmak yerine diğer işlevleri desteklemesi amaçlandığı için bir işlevin gizlenmesini isteyebilirler. Bir işlevin gizlenmesi için yazar, onu bildirimdeki FunctionsToExport dizisinin dışında tutacaktır. Burada ExportedCommands özelliğinin genişletilmiş görünümünü görebilirsiniz.
Modülleri İçe Aktarma
Modülleri kullanmaya başlamanın birçok yolu vardır. Modül dosyalarının yolunu kullanarak modülü manuel olarak içe aktarabilirsiniz. Bu, çok fazla iş yapmanıza gerek kalmadan modülü test edebilmenizi ve güncelleyebilmenizi sağlar. Ancak bu, çok fazla taşınabilirliğe izin vermez çünkü modülün tam yolunu kullanmanız gerekir. PowerShell ayrıca $env:PSModulePath değişkeninde olmayan modülleri otomatik olarak içe aktarmaz.
Komutları Seçerek İçe Aktarma
Import-Module parametresini kullanarak tüm modülün yerine yalnızca belirli işlevleri içe aktarmak için Function parametresini kullanabilirsiniz. Bu, Office 365 modülleri gibi uzak sistemlerden modülleri içe aktarırken zaman kazandırabilir.
Tüm Kullanıcı Modülleri
Tüm kullanıcılar için yüklenen modüller C:\Program Files\WindowsPowerShell\Modules dizinine yerleştirilir. Bu dizin, AllUsers varsayılan kapsamını kullanarak Install-Module kullanılarak yüklenen modüller de dahil olmak üzere birçok önceden eklenmiş modül içerir.
Mevcut Kullanıcı Modülleri
Bir modül kuruyorsanız ancak onu yalnızca tek bir kullanıcının kullanmasını istiyorsanız, CurrentUser kapsamı vardır. Bu, modül dosyalarını C:\Users\
Bu durumda, her ikisi de aynı belgeler klasörünü paylaşacağından, bir bilgisayara bir modül yükleyip başka bir bilgisayarda kullanabilirsiniz.
Sistem Modülleri
Eksiksiz olması açısından C:\Windows\System32\WindowsPowerShell\1.0\Modules konumunda bir modül dizini de bulunmaktadır. Teknik olarak bu yola yerleştirilen bir modül diğer yollardan biri gibi içe aktarılacaktır ancak bu, Microsoft'un sistem modülleri için ayrıldığından önerilmez.
Ad Vermek Önemlidir
Yeni bir oturumda varsayılan olarak kullanılabilir hale getirmek için modülünüzü bu yollardan birine manuel olarak yerleştirebilirsiniz, ancak modüller için gerekli adlandırmayı takip ettiğinizden emin olmalısınız. Modül dosyalarının yerleştirildiği klasör, psm1 modül dosyasıyla ve varsa psd1 modül bildirimiyle aynı adda olmalıdır.
Daha önce bahsettiğimiz Get-Module -ListAvailable kullanımı bu yollara referans verir. $env:PSModulePath -Split ';' komutunu kullanarak tüm modül yollarını görebilirsiniz. Listede burada gösterilenin dışında başka yollar da görebilirsiniz. Birçok program kurulduğunda kendi modül yollarını ekler. Bunun örneklerinden biri, kendi modül yollarında kendi modüllerinin yer aldığı SQL'dir.
Farklı bir işlemle kuracağınız bazı modüller de var. Bunun en önemli örneklerinden biri ActiveDirectory modülüdür. Windows 7'den Windows 10 1803'e kadar bunu Uzak Sunucu Yönetim Araçları (RSAT) yükleyicisiyle yüklersiniz.
Windows 10'un (1809+) daha yeni sürümlerinde bu yalnızca İstek Üzerine Özellikler aracılığıyla kullanılabilir. RSAT'ı yüklemek, ActiveDirectory modüllerini ve diğer Windows rollerini yönetmek için kullanacağınız diğer birçok modülü yükler. Windows sunucu işletim sistemlerinde bu modüller Sunucu Yöneticisi aracılığıyla yüklenir.
Uzak Modülleri İçe Aktarma (Örtülü Uzaktan İletişim)
Yerel olarak çalışan bir modüle sahip olmanın pratik olmadığı bazı durumlar vardır. Bunun yerine uzak bir cihaza bağlanıp, üzerinde kurulu olan bir modülü içe aktarmak daha iyidir. Bunu yaptığınızda, komutlar aslında uzaktaki makinede yürütülür. Bu, Microsoft'un Office 365 modüllerinde sıklıkla kullanılır. Birçoğu daha sonra bir modülü içe aktaran bir Office 365 sunucusuna bağlanıyor. Komutlardan herhangi birini çalıştırdığınızda, bunlar uzak sunucuda çalıştırılır ve ardından çıktı oturumunuza geri gönderilir.
Uzak modülleri içe aktarmanın başka bir kullanımı da, modülün yerel olarak kurulu olmamasıdır. ActiveDirectory modülü kurulu olmasa da onu içe aktarmayı denediyseniz elde edeceğiniz sonuç budur.
Uzak bir modülü içe aktarmak için öncelikle bir PSSession oluşturmanız gerekir. Oturumu oluşturmak için New-PSSession'ı kullanabilirsiniz. Daha sonra, Import-Module ile PSSession parametresini kullanarak uzak aygıtta bulunan modülü içe aktarırsınız.
PS51> $AdminServer = New-PSSession -ComputerName $AdminServerName -Credential (Get-Credential)
PS51> Import-Module -Name ActiveDirectory -PSSession $AdminServer -Prefix 'Rmt'
Uzak modülleri içe aktarmanın bu yöntemini kullanmak, dağıtılmış bir ortamda daha hızlı kod yürütülmesine olanak tanır. Örneğin, bilgisayarınızdan çalışıyorsanız ancak üzerinde çalıştığınız sunucular ABD genelindeyse, belirli komutların sunucularda yerel olarak çalıştırılması önemli ölçüde daha uzun sürebilir. Oysa komutları bir sunucuda çalıştırmak ve çıktıyı yerel oturumunuza geri beslemek çok daha hızlıdır.
Modül Öneki Ekleme
Uzak makineden içe aktarılan işlevlere de bir önek ekleyebilirsiniz. Bu seçenek, yerel modüller içe aktarılırken kullanılabilir ancak bir modülün farklı sürümlerini yan yana test etmenin dışında nadiren kullanılır.
Yukarıdaki import komutunu çalıştırdıysanız ve komutlara baktığınızda şunu görürsünüz:
Bu durumda yerel bir modül olmadığını göstermek için bir önek kullanabilirsiniz. Bu, yerel olarak da mevcut olan bir modülü içe aktardığınız durumlarda kullanılabilir. Ön ekin eklenmesi, kodun yürütüldüğü yerdeki karışıklığı azaltır.
Modülleri Kaldırma
Ayrıca Remove-Module kullanmadan da geçerli oturumdan bir modülü kaldırabilirsiniz. Bu, modül dosyalarını kaldırmadan bir modülü yerel oturumdan kaldırır. Bir modülü kullanmak için uzak oturumu kullandığınız bir durumda bunu kullanmak isteyebilirsiniz. Oturumunuzu temizlemek ve ardından uzak oturumun bağlantısını kesmek için Remove-Module komutunu kullanabilirsiniz.
Remove-Module'un başka bir kullanımı da, bir modülde değişiklik yapıyorsanız ve yeni bir PowerShell oturumu başlatmak istemiyorsanız. Bu durumda, oturumunuza yeniden yüklemek için Remove-Module ve ardından Import-Module komutunu kullanırsınız. Alternatif olarak, Import-Module ile Force parametresini kullanabilirsiniz. Bu, modülün kaldırılmasını ve yeniden yüklenmesini sizin için tamamlayacaktır.
PowerShell Modülünü Neler Oluşturur?
Bir modül bir veya daha fazla dosyadan oluşabilir. Bir modülün minimum gereksinimlerini karşılamak için bir modül dosyanızın olması gerekir. Bu bir PSM1 dosyası veya ikili modül dosyası gibi başka bir modül dosyası olabilir. Bunun üzerine psm1'inizin tanımlanmış işlevlere sahip olması gerekir, aksi takdirde kimseye pek faydası olmayacaktır.
İşlevlerin nasıl görünmesi veya ne yapması gerektiğine ilişkin herhangi bir gereksinim olmasa da bazı yönergeler vardır. Genellikle tüm fonksiyonların aynı konsept etrafında oluşturulmuş bir modülde olması tercih edilir.
Modüller Benzer Düşünceli İşlevler İçerir
Örneğin, ActiveDirectory modülü yalnızca Active Directory ile bir şekilde etkileşimde bulunan işlevleri içerir. Genellikle işlev adları aynı zamanda bir önek içerir. Örnek olarak ActiveDirectory modülüne dönersek, işlev adlarındaki isimlerin tümü AD ile başlar.
Bu yönergelerin kullanılması, işlevlerin keşfedilebilirliğine yardımcı olur. Bu yeni modülü yeni içe aktardığınızı ve işlevler arasında gezinmek istediğinizi düşünün. Tüm işlevlerin benzer bir ad yapısına sahip olması durumunda bunu yapmak çok daha kolaydır. Modüllerin sıklıkla PS ile başladığını görseniz de, bu önek resmi olarak yalnızca Microsoft modülleri için ayrılmıştır. Modülünüzün başında PS kullanırsanız muhtemelen sorun yaşamazsınız, başka bir modül adıyla çakışma yaratabilirsiniz.
Bu yönergeleri kullanarak, tümü kayıt defteriyle etkileşimle ilgili olan bir dizi işleviniz varsa, şöyle bir şeye sahip olabilirsiniz:
function Get-ATARegistryKey {...}
function Set-ATARegistryKey {...}Modül Bildirimleri
Metin modülü dosyası üzerinde derleme yapmak için bir modül bildirimi de ekleyebilirsiniz. Bu dosyalar PSD1 uzantısına sahiptir ve modül hakkında meta veriler içerir. Yazar hakkında bilgileri, modülün açıklamasını, diğer gerekli modülleri ve diğer birçok özelliği ekleyeceğiniz yer burasıdır. Bir veri havuzunda yayınlamak için Yazar ve Açıklama alanlarının doldurulması gerekir.
Kayıt defteri modülümüz için sahip olabileceğimiz bir manifest örneği:
#Module manifest for module 'ATARegistry'
#Generated by: Tyler
#Generated on: 8/11/2019
@{
#Script module or binary module file associated with this manifest.
RootModule = 'ATARegistry'
#Version number of this module.
ModuleVersion = '1.0'
#Supported PSEditions
#CompatiblePSEditions = @()
#ID used to uniquely identify this module
GUID = 'fef619fa-016d-4b11-a09d-b222e094de3e'
#Author of this module
Author = 'Tyler Muir'
#Company or vendor of this module
CompanyName = 'Adam the Automator'
#Copyright statement for this module
Copyright = '(c) 2019 tyler. All rights reserved.'
#Description of the functionality provided by this module
Description = 'This is a test module.'
#Minimum version of the Windows PowerShell engine required by this module
#PowerShellVersion = ''
#Name of the Windows PowerShell host required by this module
#PowerShellHostName = ''
#Minimum version of the Windows PowerShell host required by this module
#PowerShellHostVersion = ''
#Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
#DotNetFrameworkVersion = ''
#Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
#CLRVersion = ''
#Processor architecture (None, X86, Amd64) required by this module
#ProcessorArchitecture = ''
#Modules that must be imported into the global environment prior to importing this module
#RequiredModules = @()
#Assemblies that must be loaded prior to importing this module
#RequiredAssemblies = @()
#Script files (.ps1) that are run in the caller's environment prior to importing this module.
#ScriptsToProcess = @()
#Type files (.ps1xml) to be loaded when importing this module
#TypesToProcess = @()
#Format files (.ps1xml) to be loaded when importing this module
#FormatsToProcess = @()
#Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
#NestedModules = @()
#Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.
FunctionsToExport = @('Get-RegistryKey','Set-RegistryKey')
#Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export.
CmdletsToExport = @()
#Variables to export from this moduleVariablesToExport = '*'
#Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export.
AliasesToExport = @()
#DSC resources to export from this module
#DscResourcesToExport = @()
#List of all modules packaged with this module
#ModuleList = @()
#List of all files packaged with this module
#FileList = @()
#Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell.
PrivateData = @{
PSData = @{
#Tags applied to this module. These help with module discovery in online galleries.
#Tags = @()
#A URL to the license for this module.
#LicenseUri = ''
#A URL to the main website for this project.
#ProjectUri = ''
#A URL to an icon representing this module.
#IconUri = ''
#ReleaseNotes of this module
#ReleaseNotes = ''
}
#End of PSData hashtable
}
#End of PrivateData hashtable
#HelpInfo URI of this module
#HelpInfoURI = ''
#Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix.
#DefaultCommandPrefix = ''
}Bu ilk başta korkutucu görünse de, Microsoft'un modül bildirimi oluşturmak için kullanabileceğiniz kullanışlı bir cmdlet'i vardır. Dahil edilen komut New-ModuleManifest'tir. Yukarıda gösterilen manifestoyu oluşturmak için şunları kullanabilirsiniz:
PS51> New-ModuleManifest -Path .\Scripts\TestModule.psd1 -Author 'Tyler Muir' -CompanyName 'Adam the Automator' -RootModule 'TestModule.psm1' -FunctionsToExport @('Get-RegistryKey','Set-RegistryKey') -Description 'This is a test module.'Harici Yardım Dosyaları
Bazı modüllerde harici yardım dosyalarını da görebilirsiniz. Dosya adının sonundaki
Bu aynı zamanda, modülü içe aktardıktan sonra Get-Help komutunu kullanırken işlevinizin düzgün çalışması için işlevinize # .ExternalHelp eklemenizi gerektirir. . Genellikle çok büyük modüllere sahip harici yardım dosyalarını görmek yaygındır ve bu nedenle kapsam dışındadırlar.
İlgili dosyalar
Bunlar bir modülde göreceğiniz en yaygın dosya türleri olsa da, tek dosyalar bunlar değildir. Bazen başka bağımlılıklar olduğu için bir metin modülüne ek olarak ikili dosyalar da görürsünüz. Modül yollarını inceleyerek modüllerdeki ek dosya türlerinin birçok örneğini bulabilirsiniz.
Standart olmayan modül dosyalarının düzgün bir şekilde yayınlanmasını sağlamak için, diğer dosyaları modül bildiriminizdeki FileList parametresine dahil etmelisiniz.
Modül bildiriminde şu anda boş olan diğer birçok parametreyi göreceksiniz. Modülünüzü kullanmaya ilişkin diğer gereksinimleri tanımlamak için bunları kullanabilirsiniz. Örneğin modülün çalışabileceği PowerShell sürümlerini tanımlayabilirsiniz. Modülü desteklenmeyen bir PowerShell sürümüne aktarmaya çalışırsanız şunu görürsünüz:
PSDepoları
Modüller için temel dağıtım seçeneklerinden biri PSRepository'dir. 1000′ görünümde PSRepository, birden fazla kişinin veya birden fazla cihazın modül dosyalarına erişebildiği bir yereldir. Bunlar genellikle dosyaları yayınlayabileceğiniz web sunucularıdır.
Depo için bir dizin de kullanabilirsiniz, ancak bu, deponuzun işlevselliğini sınırlandırır. Kendiniz bir PSRepository barındırabilir veya PowerShell Galerisi gibi internette mevcut birçok seçenekten birini kullanabilirsiniz. Get-PSRepository komutunu kullanarak PSRepositories'inizi görebilirsiniz.
Varsayılan olarak yalnızca bir girişiniz olacaktır ve bu, PowerShell Galerisi için olacaktır. Güvenilmez diyeceğini fark edebilirsiniz. Bunun nedeni, PowerShell'in, PowerShell Galerisi'ni kullandığınızda Microsoft tarafından yazılmayan ve onaylanmayan bir kod kullanıyor olabileceğinizin farkına varmanızı sağlamasıdır. Bu, herhangi bir modül kurulmadan önce açık izin vermeniz gerekeceği anlamına gelir.
PSRepositories Ekleme
Ayrıca kendi depolarınızı da ekleyebilirsiniz. PowerShell Galerisine güvenmek için Get-PSRepository -Name PSGallery | Set-PSRepository -InstallationPolicy Trusted veya PowerShell Galerisinden ilk kez bir modül yüklediğinizde uyarıyı kabul edebilirsiniz.
Bu PSRepositories ile etkileşimde bulunmak için kullanacağınız komutların tümü PowerShellGet modülünde bulunabilir. İşlevleri burada görebilirsiniz:
PowerShellGet modülünün belirli depolarla etkileşime girmeden önce güncellenmesi gerekebilir.
Modülleri Bulma
PSRepository kullanmanın bir diğer önemli özelliği de modülleri arayabilmektir. Bu, Find-Module komutu kullanılarak gerçekleştirilir. Özellikle aradığınızı bulmak için filtrelemenin birden fazla yolu vardır, ancak şimdilik VMware modüllerini şu şekilde arayabilirsiniz:
Bu, VMware ile başlayan tüm modülleri gösterecektir. Bunların çoğu VMware'den olsa da modülü kimin yayınladığını görmek için yazar özelliğine bakmanız gerekir.
Herkes PowerShell Gallery'ye yükleme yapabileceğinden binlerce modül mevcuttur. Bu, kullanım durumunuza uygun şekilde çalışmayan modüller bulabileceğiniz anlamına gelir. Bulacağınız modüllerin çoğu açık kaynak olduğundan, modülün işlevselliğini geliştirmek için onlara katkıda bulunabilirsiniz.
Modüllerin Kurulumu
Install-Module komutunu kullanmak için modülü barındıran güvenilir bir PSRepository'e sahip olmanız gerekir. Bu PowerShell Galerisi, başka bir internet PSRepository veya kendi kendine barındırılan bir site olabilir. Modülü kurmadan önce kolayca onaylamak için Find-Module komutundan yönlendirme yapabilirsiniz.
Bir modülün sürümünü ayrıca MinimumVersion, MaximumVersion veya RequiredVersion parametrelerini kullanarak da tanımlayabilirsiniz.
Install-Module kullanılarak kurulan tüm modülleri görmek için Get-InstalledModule komutunu kullanabilirsiniz. Bu, AllUsers kapsamına veya CurrentUser kapsamınıza yüklenen tüm modülleri listeleyecektir.
Modülleri Kaldırma
Bir modülü kurabildiğiniz gibi, bir modülü de kaldırabilirsiniz. Eğer modül Install-Module komutuyla kurulmadıysa, onu Uninstall-Module komutuyla kaldıramazsınız.
Burada görebileceğiniz gibi ActiveDirectory modülünü kaldırmaya çalışıyoruz. Bu modül Install-Module ile kurulmadığı için Uninstall-Module'ü kullanmaya çalışırken bir hata alırsınız. Bu modülü kaldırabilmeniz için, modülü kurarken kullandığınız işlemleri tersine çevirerek kaldırmamız gerekir.
Bir modülün başarıyla kaldırıldığını görmek için daha önce yüklediğiniz VMware.PowerCLI modülünü kaldırabilirsiniz.
VMware.PowerCLI'yi kaldırmış olsanız bile hâlâ birçok bağımlılığın kurulu olduğunu görebilirsiniz. Tüm modülleri kaldırmak istiyorsanız Get-InstalledModule VMware'i kullanabiliriz.* | Kaldırma Modülü -Force.
Bu modülü tamamen kaldırırken bu kadar zorluk yaşamanızın nedeni, çok fazla bağımlılığa sahip olmasıdır. Üstelik bu modüllerden bazıları birbirine bağımlıdır, bu nedenle Force parametresi gerekli olacaktır.
Modülleri Güncelleme
Artık bir modülü nasıl kurup kaldıracağınızı bildiğinize göre, kurduğunuz bir modülü nasıl güncelleyeceğinizi merak ediyor olabilirsiniz.
Diğer işlemlerde olduğu gibi modül Install-Module kullanılarak kurulmadıysa PowerShell komutlarını kullanarak güncelleme yapamazsınız. Bir modülü en yeni sürüme veya daha yeni bir sürüme güncellemek için Update-Module'u kullanabilirsiniz.
Ayrıca, resmi olarak yayınlanmamış bir sürüme güncelleme yapmanıza olanak tanıyan bir AllowPreRelease anahtarı da bulunmaktadır. Bazen bu, karşılaştığınız bir hatanın düzeltilmesi veya kullanmak istediğiniz yeni bir özelliğin eklenmesi nedeniyle yardımcı olabilir.
Bir Modülü İnceleme/Kaydetme
Kullanmadan önce modülleri incelerken çok yararlı olan, daha az kullanılan komutlardan biri Save-Module komutudur. Bu komutu kullanarak, bir modülü kurmadan bir yola indirebilirsiniz.
Daha sonra dosyaları inceleyebilir ve eğer modül ikili bir modül değilse açıp modülü oluşturan koda bakabilirsiniz. Bu yalnızca bir modülün kötü niyetli bir şey yapmadığından emin olmak için değil, aynı zamanda başkalarının modüllerini nasıl yapılandırdığını öğrenmek için de iyi olabilir.
Bu örnekte, yalnızca VMware.PowerCLI modülü indirilmez, aynı zamanda tüm bağımlılıklar da indirilir. VMware.PowerCLI klasöründe gösterilenler şunlardır:
Bu, bazen son kullanıcı lisans sözleşmesi gibi standart olmayan modül dosyalarının modüle nasıl dahil edildiğini gösteren iyi bir örnektir.
Kendi Modülünüzü yazma
Artık başka birinin modülüyle nasıl etkileşim kuracağınızı gördünüz. Artık kodunuzu ölçeklenebilirlik açısından optimize etmeye başlayabilmeniz için kendinizinkini nasıl oluşturacağınızı öğrenmek istiyorsunuz.
Şablon Dosyaları Oluşturun
Öncelikle tüm modül dosyalarınız için bir klasör oluşturmanız gerekir. Konteyneri aldıktan sonra modül dosyanızı oluşturmanız gerekir. Modül dosyanızın klasörünüzle aynı ada sahip olduğundan emin olmalısınız, aksi takdirde modülünüzü yayınlamaya çalışırken PowerShell modülü doğru şekilde keşfetmeyecektir.
PS51> New-Item -Path .\Scripts -Name ATARegistry -ItemType Directory
PS51> New-Item -Path .\Scripts\ATARegistry -Name ATARegistry.psm1Artık bir manifesto da kullanmak istiyorsanız, onu konteyner ve modül dosyasıyla aynı şekilde adlandırmanız gerekecek.
PS51> New-ModuleManifest -Path .\Scripts\ATARegistry\ATARegistry.psd1 -Author 'Tyler Muir' -CompanyName 'Adam the Automator' -RootModule ATARegistry.psm1 -Description 'Used for interacting with registry keys'Konteyner, modül dosyası ve bildirim dosyasıyla tam işlevli bir modüle sahip olursunuz. Bu modülü bir PSRepository'de yayınlayabilir ve istediğiniz yere yüklemeye başlayabilirsiniz. Ancak modül dosyası boş olduğundan muhtemelen pek işinize yaramayacaktır. Deponuzun çalıştığından emin olmak amacıyla yayınlamayı test etmek için bu dosyaları kullanmaya devam edebilirsiniz.
PSRepository'i kaydetme
Modülünüzü yayınlayabilmeniz için oturumunuza başka bir PSRepository eklemeniz gerekecektir. Test için, kurulumu ve sökülmesi kolay olacağından PSRepository'iniz olarak yerel bir yol kullanabilirsiniz.
Normalde, bir dizine sahip bir PSRepository kuracaksanız, ona birden fazla bilgisayarın erişebildiğinden emin olmak istersiniz. Bunun gibi bir yerel depo oluşturabilirsiniz:
PS51> New-Item -Path C:\ -Name Repo -ItemType Directory
PS51> Register-PSRepository -Name 'LocalRepo' -SourceLocation 'C:\Repo' -PublishLocation 'C:\Repo' -InstallationPolicy TrustedYalnızca PSRepository'den indiriyorsanız ve hiç yayınlamadıysanız, PublishLocation parametresini hariç tutabilirsiniz.
Modülünüzü Yayınlama
Kurulum politikasını zaten güvenilir olarak ayarladığınız için, bir modülün depodan kurulmasına izin vermek için bir onay almayacaksınız. Artık yeni bir PSRepository'iniz olduğuna göre, Publish-Module -Name .\Scripts\ATARegistry -Repository LocalRepo'yu kullanarak modülünüzü yayınlayabilirsiniz.
Modülünüzü yayınladıktan sonra yukarıdaki komutları kullanarak modülü bulup kurulumunu yapabilirsiniz.
Artık modülü kurduğunuza göre, yerel oturumunuza aktarılan modülü görmek için Get-Module'u kullanabilirsiniz. Manifestteki FunctionsToExport dizisine herhangi bir işlev eklemediğiniz için ExportedCommands özelliği boş.
Modülünüze ekleme
Artık modülünüzü yayınlayıp kurabileceğinizi bildiğinize göre ona bazı işlevler eklemeye başlayabilirsiniz. Bir kayıt defteri anahtarını döndürmek için bir işlev ekleyerek şöyle görünmesini sağlayabilirsiniz:
function Get-ATARegistryKey {
param (
[string]$Path
)
Get-Item $Path
}Bildiriyi olduğu gibi bırakıp yeni modülünüzü yüklemeye çalışırsanız iki sorunla karşılaşırsınız. Birincisi, modülünüzün sürümünün deponuzda zaten mevcut olduğunu belirten bir hata almanızdır. Bunun nedeni bildirim dosyasındaki modül sürümünü değiştirmemiş olmanızdır.
Modül İşlevlerini Dışa Aktarma
Diğer sorun ise, modülü içe aktardıktan sonra, yeni işlevinizi bildirime eklemediğiniz için ExportedCommands özelliğinde hâlâ hiçbir işlev görememenizdir.
İşleviniz FunctionsToExport listesinde listelenmeden kullanılabilir ancak bulunması çok daha zor olur.
Boş bir dizi (
@()) tanımlamadığınız süreceFunctionsToExport'unuz için tüm işlevler, değişkenler ve takma adlar varsayılan olarak dışa aktarılır.
Bu iki sorunu çözmek için modül dosyanızı şu şekilde güncelleyebilirsiniz:
ModuleVersion = '1.1'
FunctionsToExport = 'Get-RegistryKey'Artık modülünüze bir işlev eklediğinize ve bildiriminizi bu değişiklikleri yansıtacak şekilde güncellediğinize göre, daha önce olduğu gibi aynı komutu kullanarak modülünüzün yeni sürümünü yayınlayabilirsiniz.
PS51> Publish-Module -Name .\Scripts\ATARegistry -Repository LocalRepo.FunctionsToExport ve Export-ModuleMember Arasında Karar Verme
Modül üyelerini dışa aktarırken PowerShell'in iki benzer özelliği vardır. Zorluk ikisi arasında karar vermektir. Her ikisi de doğrudur, ancak ihtiyaçlarınıza bağlı olarak biri sizin için daha iyi çalışabilir.
Hangi işlevlerin dışa aktarıldığını dinamik olarak kontrol etmek istediğinizde, dışa aktarılacak işlevlerin listesini iletebilmek için Export-ModuleMember'i kullanın. Tipik olarak bu, birden çok ayrı işlevli PS1 dosyasında nokta kaynağı kullanılırken kullanılır. Dahili işlevleri özel bir klasöre ve dışa aktarılabilir işlevleri ortak bir klasöre bölerek, tüm genel işlevleri Export-ModuleMember işlevine aktararak bunları kolayca dışa aktarabilirsiniz.
Export-ModuleMember hakkında birkaç not:
FunctionsToExportdavranışını geçersiz kılar, bu nedenleExport-ModuleMemberkomutu kullanılırsa FunctionsToExport'un hiçbir etkisi olmaz.-
Export-ModuleMember, bu değerleri dışa aktaranFunctionsToExport'un aksine, değişkenleri ve takma adları açıkça tanımlamadan dışa aktarmaz. - Birden çok
Export-ModuleMemberkomutu kullanılabilir ve bunlar öncelik almak yerine yığınlanır.
İşlev listenizde değişiklik olmasını beklemiyorsanız, modül bildirimindeki FunctionsToExport yapılandırmasını kullanmak iyi çalışır ve değişkenleri ve takma adları açıkça dışa aktarmanızı gerektirmez.
Modülünüzü Güncelleme
Son adım, güncellenen dosyaları kullanabilmek için oturumunuzda modülünüzü güncellemeniz olacaktır. Update-Module ATARegistry'i kullanarak, depoya yeni yayınladığınız güncellemeyi indirirsiniz.
Artık modülün yeni versiyonuna sahip olduğunuzu ve manifestte tanımladığınız fonksiyonu görebilirsiniz.
Yardım İçeriği Oluşturma
Daha önce gözden kaçırılan seçeneklerden biri PowerShell'de yerleşik olarak bulunan yardım sistemidir. Muhtemelen bir noktada bir işlevde Get-Help kullanmışsınızdır. Bu bilgi iki temel yolla eklenebilir.
Bunlardan ilki, fonksiyon tanımına yoruma dayalı yardım eklemektir. Bu genellikle birçok modül yazarının uygulama şeklidir. Diğer yol ise harici bir yardım dosyası kullanmaktır. Yardımın sunduğu her şeyi göstermek için Full parametresini kullanabilirsiniz.
Gördüğünüz gibi, gerçekte çok fazla bilgi yok ve alacağınız küçük bilgilerin büyük olasılıkla kimseye faydası olmayacak.
Yardım sistemindeki bu alanları doldurmak için modül dosyanıza yoruma dayalı yardım ekleyebilirsiniz. Get-Help about_Comment_Based_Help'i kullanarak yoruma dayalı yardımın tüm seçeneklerini okuyabilirsiniz.
Şimdilik fonksiyonunuzu aşağıdaki gibi görünecek şekilde güncelleyebilirsiniz. Bu, en sık kullanılan yardım parametrelerinin bir listesidir, ancak bunların tümü hala isteğe bağlıdır ve bunların yerine eklenebilecek başka parametreler de vardır.
Artık fonksiyonunuz şöyle görünüyor:
function Get-RegistryKey {
<#
.SYNOPSIS
Returns registry key using provided path.
.DESCRIPTION
The function uses the Get-Item command to return the information for a provided registry key.
.PARAMETER Path
The path that will be searched for a registry key.
.EXAMPLE
Get-RegistryKey -Path 'HKLM:\HARDWARE\DESCRIPTION\System'
.INPUTS
System.String
.OUTPUTS
Microsoft.Win32.RegistryKey
.NOTES
This module is an example of what a well documented function could look.
.LINK
https://adamtheautomator.com
#>
param(
[string]$Path
)
Get-Item $Path
}.FORWARDHELPTARGETNAME gibi bazı özel yardım parametreleri vardır. Bu seçenek, gelen tüm yardım isteklerini farklı bir komuta iletir. Bu, yardımın birden fazla komut için aynı bilgiyi göstermesi gereken durumlarda kullanılabilir.
Artık yardımı eklediğinize göre, daha önce yaptığınız gibi modül bildirimindeki sürümü güncelleyebilir, yeni sürümü yayınlayabilir ve oturumunuz için yüklü sürümü güncelleyebilirsiniz.
Şimdi fonksiyonun yardımına bakarsanız çok daha fazla bilginin mevcut olduğunu görebilirsiniz. Bu, özellikle daha az deneyimi olan ve koda bakarak modülün ne yaptığını hızlı bir şekilde anlayamayan biri için, işlevlerin nasıl kullanılacağına ilişkin belgeleri eklemenin harika bir yoludur.
Harici bir yardım dosyası olması durumunda, eklenen bilgiler aynıdır ancak bilgiler ayrı bir dosyaya yerleştirilir ve fonksiyon içerisinde bağlantılandırılır.
AllUsers modül yoluna bakarsanız, modülün sürümünü ve yüklediğiniz tüm modül dosyalarını görebilirsiniz.
Daha önce oluşturduğunuz PSRepository yolunuza C:\Repo geri dönerseniz, bir sürü NUPKG dosyası görebilirsiniz. Yayınlanan her sürüm için bir tane olacaktır. Bunlar, Publish-Module'ü kullanırken yayınladıklarınızın sıkıştırılmış versiyonlarıdır.
Özet
PowerShell konsolunu, dil olarak PowerShell'i ve komut dosyalarını yazmayı öğrendikten sonra, kendi modüllerinizi oluşturmak son adımdır. Modüller, PowerShell'de yararlı araçlar geliştirmeye başlamanıza olanak tanır. Tek bir amaç için modüller oluşturularak doğru şekilde tasarlanır ve oluşturulursa, kaçınılmaz olarak kendinizi zaman içinde giderek daha az kod yazarken bulacaksınız. Buradan itibaren daha fazla kod ve yapıda modül işlevlerinize başvurmaya başlayacaksınız.
Modül işlevleri, komut dosyalarında tekrarladığınızı bulduğunuz kodu soyutlamanıza olanak tanır. Tekerleği yeniden icat etmek ve hedefinize daha önce nasıl ulaştığınızı anlamaya çalışmak yerine, herhangi bir zamanda çağrılabilecek, daha sonra kodda başvurulacak "etiketleri" temsil ederler. Modüller, halihazırda çözdüğünüz sorunlar üzerinde zaman kaybetmenizi önlemek için benzer düşüncelere sahip kodları bir araya toplayan PowerShell kodunun son "paketlemesidir".