IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

5. diel - PowerShell - Moduly

V predchádzajúcej lekcii, PowerShell - Profily , sme sa zoznámili s PowerShell profilmi.

V dnešnej lekcii kurze PowerShell frameworku sa zoznámime s modulmi.

Čo je PowerShell modul

PowerShell modul je set custom funkcií, premenných, tried, či commandletů. Tento set je možné importovať do našej session pomocou príkazu Import-Module a jeho funkcionalitu v tejto session využívať.

Všeobecne rozlišujeme niekoľko typov modulov:

  • Script moduly: súbor s príponou .psm1, v ktorom je uložený kód. Tento typ modulov je najrozšírenejší a najobľúbenejší, pretože kód je nezkompilován a dostupný všetkým. Tomuto typu modulu budeme venovať viac pozornosti nižšie.
  • Binárne moduly: tieto moduly s príponou .dll obsahujú skompilovaný c# kód.
  • Manifest moduly: nie sú tak úplne moduly, ale dátový súbor pre script moduly. Manifest modul si popíšeme nižšie.
  • Dynamické moduly: tieto moduly sa ukladajú do pamäte a existujú len v konkrétnej Session PowerShellu. Pre tento typ modulu som ja osobne nikdy nenašiel žiadne využitie, ale je dobré vedieť, že existujú.

PowerShell má built-in funkcionalitu module AutoLoad, ktorá automaticky prevedie import modulu, ak existuje v požadovanej ceste. Tieto cesty, z ktorých je PowerShell schopný vykonať module AutoLoad, sú reprezentované premennú $env:PSModulePath a zobrazíme ich nasledovne:

$env:PSModulePath -split ';'

Taktiež, ak sa modul nachádza v jednej z týchto lokalít, je možné volať import modulu jeho mene, ak sa nachádza mimo tieto zložky, je nutné vykonať import pomocou cesty.

Autoload prebehne v momente, keď z daného modulu zavoláme akúkoľvek funkciu či commandlet. Pre zobrazenie toho, čo sa deje na pozadí, použijeme príkaz Trace-Command:

Pre ďalšie ukážku je použitý príkaz Get-AdUser, ktorý je obsiahnutý v module ActiveDirectory. Pokiaľ tento modul nemáte na svojom počítači nainštalovaný, použite iný príkaz z dostupného modulu. Výpis nainštalovaných modulov na počítači zobrazíme pomocou príkazu Get-Module -ListAvailable.

Trace-Command -Expression {Get-AdUser vojtech} -Name CommandDiscovery -PSHost

Keďže výstup z nasledujúceho príkazu je dlhý, výstup bol skrátený:

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 hľadať PowerShell moduly a ako ich stiahnuť

Je niekoľko zdrojov, kde moduly hľadať, však spomeniem iba oficiálny zdroj PowerShell modulov a to PowerShell Gallery. Z tohto oficiálneho zdroja možno ako moduly sťahovať (či už priamo z webového klienta, či priamo z PowerShellu), tak možno aj prispievať vývojom modulov. Vyhľadávanie či stiahnutia modulu priamo z PowerShellu prebieha nasledovne:

  • Get-PSRepository príkaz zobrazí konkrétne nastavenú repository modulov:
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é nastavenie PSGallery repozitára je untrusted, čo znamená že PowerShell tomuto repozitári neverí a pri inštalácii každého modulu z tohto zdroja vám bude zobrazovať warning. Toto môžeme zmeniť nasledujúcim príkazom:

Set-PSRepository -InstallationPolicy Trusted
  • Find-Module príkaz vyhľadá všetky dostupné moduly v danom repozitári. Keďže je tam modulov veľa (v čase keď som písal tento článok bolo na PowerShell galériu 6033 modulov k stiahnutiu), vyhľadáme jeden pomocou mena:

Pred prvým spustením príkazu Find-Module alebo Install-Module je potreba PowerShell rozšíriť o nugety package provider, ktorý sa stará o komunikáciu klienta (PowerShell host) a vzdialeným repozitára PSGallery. Toto prevedieme buď príkazom:

Install-PackageProvider -Name nuget

alebo nás k tomu PowerShell vyzve automaticky sám pri prvom spustení príkazu Find-Module alebo 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.

Prepínač -Verbose nám zobrazuje stav toho, čo sa deje na pozadí.

  • Install-Module príkaz nám konečne nainštaluje 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'.

Pre inštaláciu modulov je nutné spustiť Powershell ako administrátor.

Po inštalácii modulu je potreba buď reštartovať PowerShell hosťa, alebo príkazom Import-Module práve stiahnutý modul naimportovať.

  • Get-Module príkaz zobrazí informácie o danom module:
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 príkaz nám nakoniec umožní zobraziť všetky vyexportované prí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 krokoch sme si ukázali, ako si PowerShell rozšíriť o ďalšiu funkcionalitu pomocou stiahnutia a importu modulu, v našom prípade o SSH modul, ktorým sme schopní spravovať napríklad Linux servery alebo CISCO zariadení (áno, PowerShell možno efektívne využívať i pre správu CISCO sieťových zariadenie8-) ).

Tvoríme náš prvý modul

Prerekvizity tvorby modulu:

  • názov modulu, to by malo vystihovať funkcionalitu modulu.
  • príprava štruktúry zložiek pre modul. Toto je v podstate jednoduché, dajme tomu, že nás modul sa bude volať Utility, vytvoríme si teda zložku s názvom Utility, či už v jednej zo zložiek v premennej $env:PSModulePath, či kdekoľvek inde na disku, napríklad ako v mojom prípade v ceste C:\Dev\WorkDir\Utility.
  • vytvoríme si prázdny .psm1 súbor v priečinku, ktorý sme práve vytvorili, ideálne s rovnakým názvom ako meno zložky, v mojom prípade C:\Dev\WorkDir\Utility\Utility.psm1. Tento súbor bude obsahovať náš kód.

Teraz, keď máme všetko pripravené, potrebujeme do nášho modulu dať aspoň jednu funkciu, premennú, triedu či commandlet. Pre demonštráciu umiestnime do modulu jednoduchú funkciu:

function Get-CustomDate {
    Get-Date -Format 'yyyy-dd-MM hh:mm:ss.fff'
}

Teraz môžeme skúsiť import nášho modulu. Keďže v mojom prípade mám modul umiestnený mimo zložky definované v $env:PSModulePath, musím zavolať import pomocou celej cesty:

Windows PowerShell
Import-Module C:\dev\WorkDir\Utility\Utility.psm1 -Verbose

VERBOSE: Importing function 'Get-CustomDate'.

Pokiaľ ho vypíšeme, dostaneme nasledujúce informácie o module:

Windows PowerShell
Get-Module Utility

ModuleType   Version    Name                                ExportedCommands
----------   -------    ----                                ----------------
Script       0.0        Utility                             Get-CustomDate

A jeho funkcie vypíše aktuálny dátum:

Windows PowerShell
Get-CustomDate

2020-08-09 08:27:27.851

V prípade, že modul presunieme do jednej zo zložiek definovanými v $env:PSModulePath, musíme na konci modulu pridať príkaz Export-ModuleMember *, ktorý vyexportuje všetko z daného modulu. Pokiaľ tento príkaz nepoužijeme, nič z modulu Vyexportovaný nebude a naše funkcie neuvidíme. Teda náš modul bude vyzerať takto:

function Get-CustomDate {
    Get-Date -Format 'yyyy-dd-MM hh:mm:ss.fff'
}

Export-ModuleMember *

Rozšírenie modulu o manifest

Manifest je PowerShell dátový súbor s príponou .psd1 a je využiteľný nielen pre PowerShell moduly. V prípade PowerShell modulov sa chová ako riadiaci prvok pri importe tohto modulu, napríklad určuje, čo sa z modulu exportuje, aká minimálna verzia PowerShellu je nutná pre jeho import atď. V prípade modulov má manifest súbor jasne danú štruktúru a celý popis nájdeme na stránkach Microsoftu.

Našťastie má PowerShell príkaz New-ModuleManifest, ktorý tento súbor predpripraví za nás. Meno manifestu by opäť malo kopírovať meno modulu:

Windows PowerShell
New-ModuleManifest -Path C:\dev\WorkDir\Utility\Utility.psd1

Keď novovytvorený manifest otvoríme, nájdeme tam nasledujúce (k editácii opäť odporučím Visual Studio Code s rozšírením pre 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 sa stal tag funkčný, je potrebné ho odkomentovať (zmazať # znak).

Všetky tagy majú automaticky generovaný popis, teda netreba všetky vysvetľovať tu, ale zastavme sa u tých najhlavnejších:

  • # Script module or binary module file associated with this manifest.: Meno modulu spojený s týmto manifest súborom
  • # Version number of this module.: Verzia nášho modulu, ideálne vo formáte Major version. Minor version. Build. Revision (napríklad 1.0.0.3)
  • # Author of this module: autor tohto modulu
  • # Description of the functionality provided by this module: opis funkcionality tohto modulu
  • # Minimum version of the Windows PowerShell engine required by this module: minimálna požadovaná verzia PowerShellu pre import tohto 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.: Funkcie, ktoré majú byť z modulu vyexportované (pre export všetkých použijeme *). Tento tag nahrádza príkaz Export-ModuleMember a teda, akonáhle máme nakonfigurovaný tento manifest, ho môžeme z modulu odmazať.

Pre náš Utility modul, nastavíme tieto tagy takto (zvyšok tagov ponecháme bez zmeny):

# 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 = @('*')

Teraz, keď máme manifest nachystaný, vykonáme import modulu pomocou manifestu namiesto 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'.

Ak by sme chceli zabezpečiť, aby modul bežal od určitej minimálnej verzie PowerShellu, nastavíme tag PowerShellVersion na danú verziu. Na ukážku som nastavil verziu 7.0, ale môj hosť, z ktorého budem modul importovať beží na verziu 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

Aby sme mali prípravu nášho modulu kompletné, presunieme našu zložku modulu Utility do jednej z ciest v premennej $env:PSModulePath. V mojom prípade som si vybral cestu C:\Users\vojtech\Documents\WindowsPowerShell\Modules.

Teraz nám pri importe modulu stačí zadať už len jeho meno, dokonca nám ho PowerShell bude aj dopĺňať pri písaní (pre doplnenie stlač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'.

Teraz môžeme náš Utility modul obohatiť o ďalšie užitočné funkcie a využívať podľa ľubovôle:)

Záverom treba povedať, že v moduloch je pravá sila PowerShellu, pretože behom pár sekúnd kompletne pripravíme svojho hosťa pre ako aplikáciu tak dané prostredie.

V ďalšej lekcii, PowerShell - Typy výstupu , sa zoznámime s PowerShell výstupmi, naučíme sa dané typy výstupu používať v praxi a tiež ako tieto výstupy presmerovať.


 

Predchádzajúci článok
PowerShell - Profily
Všetky články v sekcii
PowerShell
Preskočiť článok
(neodporúčame)
PowerShell - Typy výstupu
Článok pre vás napísal Vojtěch Kašný
Avatar
Užívateľské hodnotenie:
1 hlasov
Aktivity