Článek přečtěte do 5 min.

Funkce PowerShell je blok kódu určený k provádění konkrétního úkolu. Jakmile je funkce vytvořena a otestována, lze ji použít ve více skriptech, což snižuje úsilí při kódování a riziko chyb. Použití dobře pojmenovaných funkcí také usnadňuje čtení a údržbu skriptů. A protože funkce mohou vracet hodnoty, které lze použít jako vstup pro jiné funkce nebo bloky kódu, usnadňují vytváření složitých operací.

Tento článek vysvětluje vše, co potřebujete vědět, abyste mohli začít používat funkce PowerShellu, včetně důležitých osvědčených postupů, a dokonce poskytuje návod, jak se ponořit do pokročilejších možností.

Začínáme s funkcemi PowerShellu

Jak vytvořit funkci v PowerShellu

Chcete-li definovat funkci, použijte klíčové slovo function. Základní syntaxe je následující: Kód ve složených závorkách {} bude proveden při volání funkce.

Pokud se rozhodnete, můžete pomocí klíčového slova param zadat parametry funkce spolu s datovými typy, výchozími hodnotami a tak dále.

Zde je syntaxe s přidanými parametry:

function  { 
    [param( 
        []$, 
        []$ =  
    )] 
     
}

Tento příklad funkce PowerShell vynásobí dvě čísla a zobrazí výsledek:

function Multiply-Numbers { 
    param ( 
        [int]$Number1, 
        [int]$Number2 
    ) 
    $Result = $Number1 * $Number2 
    Write-Output "The multiplication value of $Number1 and $Number2 is $Result." 
}

Uložení funkce

Chcete-li uložit funkci, jednoduše ji uložte do souboru skriptu s .ps1.

Volání funkce

Chcete-li vyvolat funkci v PowerShellu, zadejte název funkce následovaný všemi nezbytnými pojmenovanými parametry.

Zde je například, jak zavolat funkci, kterou jsme definovali výše:

Multiply-Numbers -number1 6 -Number2 8 

Spuštění funkce jako součást aktuální relace (Dot-Sourcing)

Dot-sourcing vám umožňuje spouštět skript PowerShellu, jako by byl definován přímo ve vaší aktuální relaci konzoly. Chcete-li použít tečkový zdroj, uveďte při volání před název funkce tečku a mezeru (. ).

Předpokládejme například, že jsme definovali následující funkci s názvem Add-Numbers: 

function Add-Numbers { 
    param ( 
        [int]$Number1, 
        [int]$Number2 
    ) 
    $Sum = $Number1 + $Number2 
    Write-Output "The sum of $Number1 and $Number2 is $Sum." 
}

Tuto funkci můžeme do naší relace použít jako bodový zdroj, jak je znázorněno zde:

Pojmenování funkcí PowerShellu

Chcete-li z funkcí PowerShellu vytěžit maximum, při pojmenovávání funkcí se řiďte těmito pokyny.

Použijte formát sloveso-podstatné jméno

PowerShell poskytuje sadu předpřipravených rutin, jejichž názvy mají určitý formát: sloveso, které určuje akci, která má být provedena, následované podstatným jménem, ​​které pojmenovává objekt, se kterým se má jednat. Rutina get-user například načte informace o uživateli a remove-item odstraní zadanou položku.

Nejlepším postupem je dodržovat stejnou konvenci pojmenování funkcí, které vytvoříte. Pokud tak učiníte, pomůže vám to navrhnout funkce efektivněji a bude snazší je znovu použít.

Používejte schválená slovesa

PowerShell poskytuje seznam sloves, která jsou doporučena pro použití ve funkcích.

Chcete-li zobrazit seznam, jednoduše spusťte následující rutinu:

Get-Verb 

Vyberte popisná podstatná jména

Je životně důležité nedávat funkci stejný název jako vestavěná rutina. Dobrý způsob, jak tomuto problému předejít, abyste se vyhnuli používání obecných podstatných jmen jako uživatel a data. Místo toho vybírejte podstatná jména, která jasně označují typ dat, na která funkce působí. Je například snadné pochopit, jak se tyto funkce liší: Get-EmployeeDataGet-UserInfo a Get-ServiceInfo.

Nepoužívejte názvy funkcí pro účely verzování

Připojování čísel verzí k názvům funkcí, jako je Get-UserInfoV2, se nedoporučuje. Skripty jsou díky tomu obtížněji srozumitelné a zvyšuje se šance na použití starých verzí funkce. Místo toho spravujte verzování prostřednictvím systému verzování souborů.

Pokročilé funkce

Přijímání vstupu potrubí

Pomocí atributu ValueFromPipeline můžete navrhnout funkci tak, aby přijímala vstup z jiné funkce nebo příkazu prostřednictvím kanálu.

Pro ilustraci vytvoříme funkci, která zpracuje seznam řetězců jeden po druhém, převede každý řetězec na velká písmena a zobrazí výsledky.

Pro přehlednost rozdělíme zpracování řetězců do tří odlišných bloků:

  • BEGIN — Tento kód se spustí jednou, před zpracováním jakéhokoli vstupu z kanálu.
  • PROCESS — Tato sekce běží pro každou položku, která je předána do kanálu, přičemž zpracovává vstupní objekty jeden po druhém.
  • END — Tento kód se spustí poté, co byl zpracován veškerý vstup, aby se dokončil výstup.
function Convert-ToUppercase { 
    [CmdletBinding()] 
    param ( 
        [Parameter(ValueFromPipeline = $true, Mandatory = $true)] 
        [string]$InputString 
    ) 
    BEGIN { 
        Write-Verbose "Starting the uppercase conversion process." 
    } 
    PROCESS { 
        if (-not [string]::IsNullOrWhiteSpace($InputString)) { 
            Write-Verbose "Processing string: $InputString" 
            $InputString.ToUpper() 
        } else { 
            Write-Verbose "Skipped empty or null string." 
        } 
    } 
    END { 
        Write-Verbose "Finished processing all strings." 
    } 
}

Zde je návod, jak bychom mohli zavolat funkci pro převod seznamu řetězců poskytovaných prostřednictvím potrubí:

"hello", "world", "this", "is", "powershell" | Convert-ToUppercase -Verbose 

Všimněte si, že odlehčené funkce zvané filtry mohou poskytnout vysoce efektivní způsob zpracování objektů procházejících potrubím.

Povolení funkce, aby se chovala jako rutina

Pomocí atributu CmdletBinding můžete změnit základní funkci na pokročilou funkci. Díky tomu se funkce bude chovat jako rutina, včetně podpory definovaných parametrů prostředí PowerShell.

Zde je základní funkce, kterou jsme dříve definovali pro sečtení dvou čísel:

function Add-Numbers { 
    param ( 
        [int]$Number1, 
        [int]$Number2 
    ) 
    $Sum = $Number1 + $Number2 
    Write-Output "The sum of $Number1 and $Number2 is $Sum." 
}

Můžeme ji přeměnit na pokročilou funkci takto:

function Add-Numbers { 
    [CmdletBinding()] 
    param ( 
        [Parameter(Mandatory)] 
        [int]$Number1, 
        [Parameter(Mandatory)] 
        [int]$Number2 
    ) 
    process { 
        # Verbose Output 
        Write-Verbose "Starting addition of $Number1 and $Number2" 
        # Debugging Output 
        Write-Debug "Debugging: Ensuring numbers are valid integers" 
        # Perform the Addition 
        try { 
            $Result = $Number1 + $Number2 
            Write-Output $Result 
        } catch { 
            # Handle errors with error stream 
            Write-Error "An error occurred while performing the addition." 
        } 
        # Verbose Completion Message 
        Write-Verbose "Addition completed successfully" 
    } 
}

Pro další informace nás neváhejte kontaktovat.

Zdroj: Netwrix