Lekce 5 - PowerShell - Moduly
V předchozí lekci, PowerShell - Profily, jsme se seznámili s PowerShell profily.
V dnešní lekci kurzu PowerShell frameworku se seznámíme s moduly.
Co je PowerShell modul
PowerShell modul je set custom funkcí, proměnných, tříd, či
commandletů. Tento set je možno importovat do naší sessiony pomocí
příkazu Import-Module
a jeho funkcionalitu v této sessioně
využívat.
Obecně rozlišujeme několik typů modulů:
- Script moduly: soubor s příponou
.psm1
, ve kterém je uložen kód. Tento typ modulů je nejrozšířenější a nejoblíbenější, jelikož kód je nezkompilován a dostupný všem. Tomuto typu modulu budeme věnovat více pozornosti níže. - Binární moduly: tyto moduly s příponou
.dll
obsahují zkompilovanýc#
kód. - Manifest moduly: nejsou tak úplně moduly, ale datový soubor pro script moduly. Manifest modul si popíšeme níže.
- Dynamické moduly: tyto moduly se ukládají do paměti a existují pouze v konkrétní sessioně PowerShellu. Pro tento typ modulu jsem já osobně nikdy nenašel žádné využití, ale je dobré vědět, že existují.
PowerShell má built-in funkcionalitu module autoload,
která automaticky provede import modulu, pokud existuje v požadované cestě.
Tyto cesty, ze kterých je PowerShell schopen provést module autoload, jsou
reprezentovány proměnnou $env:PSModulePath
a zobrazíme je
následovně:
$env:PSModulePath -split ';'
Taktéž, pokud se modul nachází v jedné z těchto lokalit, je možné volat import modulu jeho jménem, pokud se nachází mimo tyto složky, je nutné provést import pomocí cesty.
Autoload proběhne v momentě, kdy z daného modulu zavoláme jakoukoliv
funkci či commandlet. Pro zobrazení toho, co se děje na pozadí, použijeme
příkaz Trace-Command
:
Pro další ukázku je použit příkaz Get-AdUser
,
který je obsažen v modulu ActiveDirectory. Pokud tento modul nemáte na svém
počítači nainstalován, použijte jiný příkaz z dostupného modulu. Výpis
nainstalovaných modulů na počítači zobrazíme pomocí
příkazu Get-Module -ListAvailable
.
Trace-Command -Expression {Get-AdUser vojtech} -Name CommandDiscovery -PSHost
Jelikož výstup z následujícího příkazu je dlouhý, výstup byl zkrácen:
Windows PowerShell Trace-Command -Expression {Get-AdUser vojtech} -Name CommandDiscovery -PSHost DEBUG: CommandDiscovery Information: 0 : Looking up command: Get-AdUser DEBUG: CommandDiscovery Information: 0 : PATH: DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in d:\software\oracle\product\12.2.0\client_x86\bin DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Python27\ DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Python27\Scripts DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\app\client\vojtech\product\12.2.0\client_1\bin DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in d:\oracle\product\12.2.0\client_x86\bin DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\WINDOWS\system32 DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\WINDOWS DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\WINDOWS\System32\Wbem DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\WINDOWS\System32\WindowsPowerShell\v1.0\ DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\WINDOWS\System32\OpenSSH\ DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\PowerShell\6-preview\preview DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\dotnet\ DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\Microsoft SQL Server\130\Tools\Binn\ DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\ProgramData\chocolatey\bin DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\PowerShell\7-preview\preview DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\nodejs\ DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files (x86)\vim\vim80 DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\ DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn\ DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\Microsoft SQL Server\140\Tools\Binn\ DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Users\vojtech\AppData\Local\Microsoft\WindowsApps DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Users\vojtech\AppData\Local\Programs\Microsoft VS Code\bin DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Users\vojtech\AppData\Roaming\npm DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\WindowsPowerShell\Modules\Pester\4.8.1\bin DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\WindowsPowerShell\Modules\Pester\4.9.0\bin DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\WindowsPowerShell\Modules\Pester\4.10.1\bin DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Users\vojtech\.dotnet\tools DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\MongoDB\Server\4.2\bin DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\Microsoft VS Code\bin DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\PowerShell\7\ DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\Git\cmd DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files\PowerShell\6\ DEBUG: CommandDiscovery Information: 0 : Looking for Get-AdUser.* in C:\Program Files (x86)\GitExtensions\ DEBUG: CommandDiscovery Information: 0 : Cmdlet found: Get-Module Microsoft.PowerShell.Commands.GetModuleCommand DEBUG: CommandDiscovery Information: 0 : Cmdlet found: Import-Module Microsoft.PowerShell.Commands.ImportModuleCommand DEBUG: CommandDiscovery Information: 0 : Executing non module-qualified search: Get-AdUser DEBUG: CommandDiscovery Information: 0 : Found in module: C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\ActiveDirectory\ActiveDirectory.psd1 DEBUG: CommandDiscovery Information: 0 : Attempting to load module: C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\ActiveDirectory\ActiveDirectory.psd1 DEBUG: CommandDiscovery Information: 0 : Cmdlet found: Get-ADUser Microsoft.ActiveDirectory.Management.Commands.GetADUser ...
Kde hledat PowerShell moduly a jak je stáhnout
Je několik zdrojů, kde moduly hledat, nicméně zmíním pouze oficiální zdroj PowerShell modulů a to PowerShell Gallery. Z tohoto oficiálního zdroje lze jak moduly stahovat (ať už přímo z webového klienta, či přímo z PowerShellu), tak lze i přispívat vývojem modulů. Vyhledávání či stažení modulu přímo z PowerShellu probíhá následovně:
Get-PSRepository
příkaz zobrazí konkrétně nastavenou repository modulů:
Windows PowerShell Get-PSRepository | Select-Object * Name : PSGallery SourceLocation : https://www.powershellgallery.com/api/v2 Trusted : True Registered : True InstallationPolicy : Trusted PackageManagementProvider : NuGet PublishLocation : https://www.powershellgallery.com/api/v2/package/ ScriptSourceLocation : https://www.powershellgallery.com/api/v2/items/psscript ScriptPublishLocation : https://www.powershellgallery.com/api/v2/package/ ProviderOptions : {}
Základní bezpečnostní nastavení PSGallery repositáře je Untrusted, což znamená že PowerShell tomuto repozitáři nevěří a při instalaci každého modulu z tohoto zdroje vám bude zobrazovat warning. Toto můžeme změnit následujícím příkazem:
Set-PSRepository -InstallationPolicy Trusted
Find-Module
příkaz vyhledá všechny dostupné moduly v daném repozitáři. Jelikož je tam modulů mnoho (v době kdy jsem psal tento článek bylo na PowerShell galerii 6033 modulů ke stažení), vyhledáme jeden pomocí jména:
Před prvním spuštěním příkazu Find-Module
nebo Install-Module
je potřeba PowerShell rozšířit o NuGet
package provider, který se stará o komunikaci klienta (PowerShell host) a
vzdáleným repositářem PSGallery. Toto provedeme buď příkazem:
Install-PackageProvider -Name nuget
nebo nás k tomu PowerShell vyzve automaticky sám při
prvním spuštění příkazu Find-Module
nebo
Install-Module
.
Windows PowerShell Find-Module Posh-Ssh -Verbose VERBOSE: Repository details, Name = 'PSGallery', Location = 'https://www.powershellgallery.com/api/v2'; IsTrusted = 'True'; IsRegistered = 'True'. VERBOSE: Repository details, Name = 'PSGallery', Location = 'https://www.powershellgallery.com/api/v2'; IsTrusted = 'True'; IsRegistered = 'True'. VERBOSE: Using the provider 'PowerShellGet' for searching packages. VERBOSE: The -Repository parameter was not specified. PowerShellGet will use all of the registered repositories. VERBOSE: Getting the provider object for the PackageManagement Provider 'NuGet'. VERBOSE: The specified Location is 'https://www.powershellgallery.com/api/v2' and PackageManagementProvider is 'NuGet'. VERBOSE: Searching repository 'https://www.powershellgallery.com/api/v2/FindPackagesById()?id='Posh-Ssh'' for ''. VERBOSE: Total package yield:'1' for the specified package 'Posh-Ssh'. Version Name Repository Description ------- ---- ---------- ----------- 2.2 Posh-SSH PSGallery Provide SSH and SCP functionality for executing commands against remote hosts.
Přepínač -Verbose
nám zobrazuje stav toho, co
se děje na pozadí.
Install-Module
příkaz nám konečně nainstaluje požadovaný modul:
Windows PowerShell Install-Module posh-ssh -Verbose VERBOSE: Using the provider 'PowerShellGet' for searching packages. VERBOSE: The -Repository parameter was not specified. PowerShellGet will use all of the registered repositories. VERBOSE: Getting the provider object for the PackageManagement Provider 'NuGet'. VERBOSE: The specified Location is 'https://www.powershellgallery.com/api/v2' and PackageManagementProvider is 'NuGet'. VERBOSE: Searching repository 'https://www.powershellgallery.com/api/v2/FindPackagesById()?id='posh-ssh'' for ''. VERBOSE: Total package yield:'1' for the specified package 'posh-ssh'. VERBOSE: Performing the operation "Install-Module" on target "Version '2.2' of module 'Posh-SSH'". VERBOSE: The installation scope is specified to be 'AllUsers'. VERBOSE: The specified module will be installed in 'C:\Program Files\WindowsPowerShell\Modules'. VERBOSE: The specified Location is 'NuGet' and PackageManagementProvider is 'NuGet'. VERBOSE: Downloading module 'Posh-SSH' with version '2.2' from the repository 'https://www.powershellgallery.com/api/v2'. VERBOSE: Searching repository 'https://www.powershellgallery.com/api/v2/FindPackagesById()?id='Posh-SSH'' for ''. VERBOSE: InstallPackage' - name='Posh-SSH', version='2.2',destination='C:\Users\vojtech\AppData\Local\Temp\1543180928' VERBOSE: DownloadPackage' - name='Posh-SSH', version='2.2',destination='C:\Users\vojtech\AppData\Local\Temp\1543180928\Posh-SSH\Posh-SSH.nupkg', uri='https://www.powershellgallery.com/api/v2/package/Posh-SSH/2.2.0' VERBOSE: Downloading 'https://www.powershellgallery.com/api/v2/package/Posh-SSH/2.2.0'. VERBOSE: Completed downloading 'https://www.powershellgallery.com/api/v2/package/Posh-SSH/2.2.0'. VERBOSE: Completed downloading 'Posh-SSH'. VERBOSE: Hash for package 'Posh-SSH' does not match hash provided from the server. VERBOSE: InstallPackageLocal' - name='Posh-SSH', version='2.2',destination='C:\Users\vojtech\AppData\Local\Temp\1543180928' VERBOSE: Catalog file 'Posh-SSH.cat' is not found in the contents of the module 'Posh-SSH' being installed. VERBOSE: Module 'Posh-SSH' was installed successfully to path 'C:\Program Files\WindowsPowerShell\Modules\Posh-SSH\2.2'.
Pro instalaci modulů je nutné spustit Powershell jako administrátor.
Po instalaci modulu je potřeba buď restartovat PowerShell
hosta, nebo příkazem Import-Module
právě stažený modul
naimportovat.
Get-Module
příkaz zobrazí informace o daném modulu:
Windows PowerShell Get-Module posh-ssh ModuleType Version Name ExportedCommands ---------- ------- ---- ---------------- Manifest 2.2 Posh-SSH {Get-SCPFile, Get-SCPFolder, Get-SCPItem, Get-SFTPFile...}
Get-Command
příkaz nám nakonec umožní zobrazit všechny vyexportované příkazy z daného modulu:
Windows PowerShell Get-Command -Module Posh-SSH CommandType Name Version Source ----------- ---- ------- ------ Function Get-PoshSSHModVersion 2.2 Posh-SSH Function Get-SFTPChildItem 2.2 Posh-SSH Function Get-SFTPContent 2.2 Posh-SSH Function Get-SFTPLocation 2.2 Posh-SSH Function Get-SFTPPathAttribute 2.2 Posh-SSH Function Get-SFTPSession 2.2 Posh-SSH Function Get-SSHPortForward 2.2 Posh-SSH Function Get-SSHSession 2.2 Posh-SSH Function Get-SSHTrustedHost 2.2 Posh-SSH Function Invoke-SSHCommand 2.2 Posh-SSH Function Invoke-SSHCommandStream 2.2 Posh-SSH Function Invoke-SSHStreamExpectAction 2.2 Posh-SSH Function Invoke-SSHStreamExpectSecureAction 2.2 Posh-SSH Function Invoke-SSHStreamShellCommand 2.2 Posh-SSH Function Move-SFTPItem 2.2 Posh-SSH Function New-SFTPFileStream 2.2 Posh-SSH Function New-SFTPItem 2.2 Posh-SSH Function New-SFTPSymlink 2.2 Posh-SSH Function New-SSHDynamicPortForward 2.2 Posh-SSH Function New-SSHLocalPortForward 2.2 Posh-SSH Function New-SSHRemotePortForward 2.2 Posh-SSH Function New-SSHShellStream 2.2 Posh-SSH Function New-SSHTrustedHost 2.2 Posh-SSH Function Remove-SFTPItem 2.2 Posh-SSH Function Remove-SFTPSession 2.2 Posh-SSH Function Remove-SSHSession 2.2 Posh-SSH Function Remove-SSHTrustedHost 2.2 Posh-SSH Function Rename-SFTPFile 2.2 Posh-SSH Function Set-SFTPContent 2.2 Posh-SSH Function Set-SFTPLocation 2.2 Posh-SSH Function Set-SFTPPathAttribute 2.2 Posh-SSH Function Start-SSHPortForward 2.2 Posh-SSH Function Stop-SSHPortForward 2.2 Posh-SSH Function Test-SFTPPath 2.2 Posh-SSH Cmdlet Get-SCPFile 2.2 Posh-SSH Cmdlet Get-SCPFolder 2.2 Posh-SSH Cmdlet Get-SCPItem 2.2 Posh-SSH Cmdlet Get-SFTPFile 2.2 Posh-SSH Cmdlet Get-SFTPItem 2.2 Posh-SSH Cmdlet New-SFTPSession 2.2 Posh-SSH Cmdlet New-SSHSession 2.2 Posh-SSH Cmdlet Set-SCPFile 2.2 Posh-SSH Cmdlet Set-SCPFolder 2.2 Posh-SSH Cmdlet Set-SCPItem 2.2 Posh-SSH Cmdlet Set-SFTPFile 2.2 Posh-SSH Cmdlet Set-SFTPFolder 2.2 Posh-SSH Cmdlet Set-SFTPItem 2.2 Posh-SSH
V těchto pár krocích jsme si ukázali, jak si PowerShell rozšířit o další funkcionalitu pomocí stažení a importu modulu, v našem případě o SSH modul, kterým jsme schopni spravovat například Linux servery či CISCO zařízení (ano, PowerShell lze efektivně využívat i pro správu CISCO síťových zařízení ).
Tvoříme náš první modul
Prerekvizity tvorby modulu:
- název modulu, to by mělo vystihovat funkcionalitu modulu.
- příprava struktury složek pro modul. Toto je v podstatě jednoduché,
dejme tomu, že nás modul se bude jmenovat Utility,
vytvoříme si tedy složku s názvem
Utility
, ať už v jedné ze složek v proměnné$env:PSModulePath
, či kdekoliv jinde na disku, například jako v mém případě v cestěC:\Dev\WorkDir\Utility
. - vytvoříme si prázdný
.psm1
soubor ve složce, který jsme právě vytvořili, ideálně se stejným názvem jako jméno složky, v mém případěC:\Dev\WorkDir\Utility\Utility.psm1
. Tento soubor bude obsahovat náš kód.
Nyní, když máme vše připraveno, potřebujeme do našeho modulu dát alespoň jednu funkci, proměnnou, třídu či commandlet. Pro demonstraci umístíme do modulu jednoduchou funkci:
function Get-CustomDate { Get-Date -Format 'yyyy-dd-MM hh:mm:ss.fff' }
Nyní můžeme zkusit import našeho modulu. Jelikož v mém případě mám
modul umístěn mimo složky definované v $env:PSModulePath
,
musím zavolat import pomocí celé cesty:
Windows PowerShell Import-Module C:\dev\WorkDir\Utility\Utility.psm1 -Verbose VERBOSE: Importing function 'Get-CustomDate'.
Pokud ho vypíšeme, dostaneme následující informace o modulu:
Windows PowerShell Get-Module Utility ModuleType Version Name ExportedCommands ---------- ------- ---- ---------------- Script 0.0 Utility Get-CustomDate
A jeho funkce vypíše aktuální datum:
Windows PowerShell Get-CustomDate 2020-08-09 08:27:27.851
V případě, že modul přesuneme do jedné ze složek definovanými v
$env:PSModulePath
, musíme na konci modulu přidat příkaz
Export-ModuleMember *
, který vyexportuje vše z daného modulu.
Pokud tento příkaz nepoužijeme, nic z modulu vyexportováno nebude a naše
funkce neuvidíme. Tedy náš modul bude vypadat takto:
function Get-CustomDate { Get-Date -Format 'yyyy-dd-MM hh:mm:ss.fff' } Export-ModuleMember *
Rozšíření modulu o manifest
Manifest je PowerShell datový soubor s příponou .psd1
a je
využitelný nejen pro PowerShell moduly. V případě PowerShell modulů se
chová jako řídící prvek při importu tohoto modulu, například určuje, co
se z modulu exportuje, jaká minimální verze PowerShellu je nutná pro jeho
import atd. V případě modulů má manifest soubor jasně danou strukturu a
celý popis najdeme na stránkách
Microsoftu.
Naštěstí má PowerShell příkaz New-ModuleManifest
, který
tento soubor předpřipraví za nás. Jméno manifestu by opět mělo kopírovat
jméno modulu:
Windows PowerShell
New-ModuleManifest -Path C:\dev\WorkDir\Utility\Utility.psd1
Když nově vytvořený manifest otevřeme, najdeme tam následující (k editaci opět doporučím Visual Studio Code s rozšířením pro PowerShell):
# # Module manifest for module 'Utility' # # Generated by: vojtech # # Generated on: 9/9/2020 # @{ # Script module or binary module file associated with this manifest. # RootModule = '' # Version number of this module. ModuleVersion = '1.0' # Supported PSEditions # CompatiblePSEditions = @() # ID used to uniquely identify this module GUID = '19480cbb-c0ef-4373-9284-591af100283f' # Author of this module Author = 'vojtech' # Company or vendor of this module CompanyName = 'Unknown' # Copyright statement for this module Copyright = '(c) 2020 vojtech. All rights reserved.' # Description of the functionality provided by this module # Description = '' # 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 = @() # 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 module VariablesToExport = '*' # 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 = '' }
Aby se stal tag funkční, je třeba jej
odkomentovat (smazat #
znak).
Všechny tagy mají automaticky generovaný popis, tudíž netřeba všechny vysvětlovat zde, ale zastavme se u těch nejhlavnějších:
# Script module or binary module file associated with this manifest.
: jméno modulu spojený s tímto manifest souborem# Version number of this module.
: verze našeho modulu, ideálně ve formátu Major version.Minor version.Build.Revision (například 1.0.0.3)# Author of this module
: autor tohoto modulu# Description of the functionality provided by this module
: popis funkcionality tohoto modulu# Minimum version of the Windows PowerShell engine required by this module
: minimální požadovaná verze PowerShellu pro import tohoto modulu# 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.
: funkce, které mají být z modulu vyexportovány (pro export všech použijeme*
). Tento tag nahrazuje příkazExport-ModuleMember
a tudíž, jakmile máme nakonfigurovaný tento manifest, jej můžeme z modulu odmazat.
Pro náš Utility modul, nastavíme tyto tagy takto (zbytek tagů ponecháme beze změny):
# Script module or binary module file associated with this manifest. RootModule = 'Utility.psm1' # Version number of this module. ModuleVersion = '1.0.0.0' # Author of this module Author = 'vojtech' # Description of the functionality provided by this module Description = 'Můj první testovací modul' # 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 = @('*')
Nyní, když máme manifest nachystán, provedeme import modulu pomocí manifestu namísto modulu samotného:
Windows PowerShell Import-Module C:\dev\WorkDir\Utility\Utility.psd1 -Verbose VERBOSE: Loading module from path 'C:\dev\WorkDir\Utility\Utility.psd1'. VERBOSE: Loading module from path 'C:\dev\WorkDir\Utility\Utility.psm1'. VERBOSE: Exporting function 'Get-CustomDate'. VERBOSE: Importing function 'Get-CustomDate'.
Pokud bychom chtěli zajistit, aby modul běžel od určité minimální
verze PowerShellu, nastavíme tag PowerShellVersion
na danou verzi.
Na ukázku jsem nastavil verzi 7.0, ale můj host, ze kterého budu modul
importovat běží na verzi 5.1:
Windows PowerShell Import-Module C:\dev\WorkDir\Utility\Utility.psd1 Import-Module : The version of Windows PowerShell on this computer is '5.1.18362.752'. The module 'C:\dev\WorkDir\Utility\Utility.psd1' requires a minimum Windows PowerShell version of '7.0' to run. Verify that you have the minimum required version of Windows PowerShell installed, and then try again. At line:1 char:1 + Import-Module C:\dev\WorkDir\Utility\Utility.psd1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ResourceUnavailable: (C:\dev\WorkDir\Utility\Utility.psd1:String) [Import-Module], InvalidOperationException + FullyQualifiedErrorId : Modules_InsufficientPowerShellVersion,Microsoft.PowerShell.Commands.ImportModuleCommand
Abychom měli přípravu našeho modulu kompletní, přesuneme naši složku
modulu Utility
do jedné z cest v proměnné
$env:PSModulePath
. V mém případě jsem si vybral cestu
C:\Users\vojtech\Documents\WindowsPowerShell\Modules
.
Nyní nám při importu modulu stačí zadat již jen jeho jméno, dokonce nám ho PowerShell bude i doplňovat při psaní (pro doplnění zmáčkněte klávesu TAB):
Windows PowerShell Import-Module Utility -Verbose VERBOSE: Loading module from path 'C:\Users\vojtech\Documents\WindowsPowerShell\Modules\Utility\Utility.psd1'. VERBOSE: Loading module from path 'C:\Users\vojtech\Documents\WindowsPowerShell\Modules\Utility\Utility.psm1'. VERBOSE: Exporting function 'Get-CustomDate'. VERBOSE: Importing function 'Get-CustomDate'.
Nyní můžeme náš Utility modul obohatit o další užitečné funkce a využívat dle libosti
Závěrem nutno říci, že v modulech je pravá síla PowerShellu, jelikož během pár vteřin kompletně připravíme svého hosta pro jak aplikaci tak dané prostředí.
V další lekci, PowerShell - Typy výstupu, se seznámíme s PowerShell výstupy, naučíme se dané typy výstupu používat v praxi a také jak tyto výstupy přesměrovat.