Funkcie v PowerShelli sa dajú zapisovať rozličnými spôsobmi. Ukážme si jednoduchú funkciu, ktorá zráta veľkost súborov v aktuálnom adresári:
function Get-Size($Unit) {
    Get-ChildItem -File 
    | Measure-Object -Property Length -Sum 
    | Select-Object -ExpandProperty Sum
    | ForEach-Object { $_ / ("1" + $Unit)}
}
Funkcia má jeden netypovaný parameter s názvom $Unit a vieme ju použiť nasledovne:
Get-Size MB
Konvencie však odporúčajú zapisovať parametre v sekcii param:
function Get-Size {
    param (
        [String]
        $Unit = "MB"
    )
    Get-ChildItem -File 
    | Measure-Object -Property Length -Sum 
    | Select-Object -ExpandProperty Sum
    | ForEach-Object { $_ / ("1" + $Unit)}
}
Parameter $Unit má implicitnú hodnotu MB a je typu String.
Volať ho môžeme nasledovne:
Get-Size 20
Funkcie ako cmdlety cez atribút CmdletBinding
Ak chceme, aby sa funkcia tvárila ako cmdlet, dodajme na začiatok atribút CmdletBinding:
function Get-Size {
    [CmdletBinding(PositionalBinding = $False)]
    param (
        [String]
        $Unit = "MB"
    )
    Get-ChildItem -File 
    | Measure-Object -Property Length -Sum 
    | Select-Object -ExpandProperty Sum
    | ForEach-Object { $_ / ("1" + $Unit)}
}
Vypnutie pozičných argumentov
Vypli sme pozičné argumenty, teda každý argument musí mať meno.
Ak spustíme len Get-Size GB, uvidíme chybovú hlášku: A positional parameter cannot be found that accepts argument 'GB'
Správne použitie je:
Get-Size -Unit GB
Štandardné prepínače
Dostaneme podporu pre štandardné parametre, ako napríklad $ErrorAction a $ErrorVariable.
Ak teraz zavoláme funkciu s vymyslenou jednotkou “mobobajty”, a použijeme ignorovanie chyby, funkcia veselo pobeží ďalej.
Get-Size -Unit BB -ErrorAction SilentlyContinue
Podpora pre ladiace výpisy
Automaticky dostaneme možnosť využívať vypisovacie / logovacie cmdlety:
Write-Verbosepre výpisy, ktoré sa zapnú, ak cmdlet pustíme s parametrom-VerboseWrite-Debugpre výpisy, ktoré sa zapnú ak použijeme prepínačDebug
Automatická premenná $PSCmdlet
Dostaneme k dispozícii automatickú premennú $PSCmdlet (typu  System.Management.Automation.PSScriptCmdlet) s prístupom k nastaveniam, napr. k stránkovaniu.
Validácie
Parametre možno validovať.
Validácie pomocou regexu
Napríklad validácia oproti regexu:
[Parameter()]
[ValidatePattern("[kKmMtTpP][bB]")]
[String]
$Unit = "MB"
V atribúte ValidatePattern môžeme uviesť regulárny výraz.
Validácie pomocou skriptu
Validácie môžu využívať skripty - stačí uviesť atribút ValidateScript a vo vnútri uviesť kód, ktorý bud vráti $true alebo vyhodí výnimku`
[Parameter(ValueFromPipeline = $true)]
[ValidateScript({
    if(-Not ($_ | Test-Path)) {
        throw "File or folder does not exist" 
    }
    $true
})]
[System.IO.FileInfo] $Path
Okrem toho vidíme aj ďalšie pokročilé vlastnosti:
- Skript berie hodnotu z rúry (
ValueFromPipeline - Dátový typ je 
FileInfo, čo obmedzí hodnoty len na cesty k adresárom, či súborom 
Skript tak môžeme zavolať:
Get-Item /tmp | Get-Size -Unit "MB"
Ak pošleme do rúry reťazec, ten sa automaticky konvertuje na objekt typu FileInfo a validuje.
Pošlime do rúry neexistujúci priečinok a uvidíme chybu:
"/nonexistent" | Get-Size -Unit "MB"
Uvidíme:
Cannot validate argument on parameter 'Path'. File or folder does not exist
Ďalšie užitočné vlastnosti
Povinné parametre
Parameter môžeme označiť ako Mandatory, teda povinný:
[Parameter(Mandatory=$true)]
Prepínače
Parameter s atribútom [Switch] je prepínač, teda má hodnotu $True alebo $False.