BLACK FRIDAY! Slevy až 80 % jsou všude. Tak je nepropásni a přejdi do rostoucího IT oboru!
BF Sales

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
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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í 8-) ).

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říkaz Export-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.


 

Předchozí článek
PowerShell - Profily
Všechny články v sekci
PowerShell
Článek pro vás napsal Vojtěch Kašný
Avatar
Jak se ti líbí článek?
1 hlasů
Aktivity (11)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!