Wat
Dit artikel biedt een uitgebreide gids over PowerShell scripting best practices, met de focus op code-structuur, outputformattering, foutafhandeling, prestatieoptimalisatie en beveiligingsmaatregelen.
Waarom
Het volgen van best practices in PowerShell scripting zorgt ervoor dat scripts leesbaar, onderhoudbaar, veilig en efficiënt zijn. Dit vermindert technische schulden, bevordert samenwerking en minimaliseert risico’s in productieomgevingen.
Hoe
Tool- en Controller-ontwerp
Bepaal of je een ‘Tool’ of een ‘Controller’ schrijft
- Tool: Herbruikbare functies/modules.
- Controller: Automatiseert een specifieke taak, niet bedoeld voor hergebruik.
Maak je code modulair
- Gebruik functies en scriptmodules voor maximale herbruikbaarheid.
Gebruik standaard naamgevingsconventies
- Volg het Werkwoord-ZelfstandigNaamwoord formaat met goedgekeurde PowerShell-werkwoorden (
Get-Verb
).
Standaardiseer parameternamen
- Gebruik namen zoals
$ComputerName
in plaats van aangepaste prefixen.
Tools geven ruwe data uit
- Tools moeten minimaal bewerkte data teruggeven voor flexibiliteit.
Controllers geven geformatteerde data uit
- Controllers kunnen gegevens formatteren voor gebruiksvriendelijke rapporten.
Voorbeeld
function Get-DiskInfo {
param ([string]$ComputerName)
Get-WmiObject Win32_LogicalDisk -ComputerName $ComputerName
}
Vermijd het heruitvinden van het wiel
Gebruik ingebouwde cmdlets zoals Test-Connection
in plaats van aangepaste ping-functies.
# Voorkeur
Test-Connection $ComputerName -Quiet
Schrijven van parameterblokken
Schrijf altijd helpinformatie
Voeg commentaar-gebaseerde help toe met .SYNOPSIS
, .DESCRIPTION
en minstens één .EXAMPLE
.
function Test-Help {
<#
.SYNOPSIS
Toont correcte helpdocumentatie.
.EXAMPLE
Test-Help -MandatoryParameter "Voorbeeld"
Voert de Test-Help functie uit met een verplichte parameter.
#>
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[Alias("MP")]
[String]$MandatoryParameter
)
}
Gebruik [CmdletBinding()]
Activeert algemene parameters zoals -Verbose
, -Debug
, -ErrorAction
.
Ondersteun -WhatIf en -Confirm
Gebruik SupportsShouldProcess
voor opdrachten die wijzigingen aanbrengen.
[CmdletBinding(SupportsShouldProcess, ConfirmImpact = "Medium")]
param ([switch]$Force)
Sterk type parameters
Definieer altijd parameter types voor validatie en duidelijkheid.
param (
[string]$Name,
[int]$Count
)
Gebruik [switch] correct
- Standaardwaarde is
$false
. - Gebruik het als een boolean, vermijd drie-staten logica.
Output Formattering
Vermijd Write-Host tenzij noodzakelijk
Gebruik Write-Verbose
, Write-Debug
of Write-Output
afhankelijk van de situatie.
Gebruik Write-Progress voor voortgangsupdates
Write-Progress -Activity "Bezig met verwerken" -Status "50% voltooid" -PercentComplete 50
Gebruik format-bestanden voor aangepaste objecten
Definieer .format.ps1xml
bestanden in plaats van inline formatting.
Geef slechts één type object tegelijk uit
Gebruik [OutputType()]
en vermijd gemengde objecttypes.
Best Practices voor Foutafhandeling
Gebruik -ErrorAction Stop met cmdlets
Forceer fouten om ze te kunnen afhandelen met try-catch
.
try {
Get-Item "C:\OngeldigPad" -ErrorAction Stop
} catch {
Write-Warning "Item niet gevonden."
}
Gebruik $ErrorActionPreference voor niet-cmdlets
Tijdelijk instellen op 'Stop'
rond risicovolle operaties.
Vermijd flags en $? voor foutafhandeling
Gebruik gestructureerde try-catch
blokken.
Kopieer $Error[0] of $_ direct in catch
catch {
$errorDetails = $_
Write-Error "Er is een fout opgetreden: $($errorDetails.Exception.Message)"
}
Prestatieoptimalisatie
PERF-01 Meet prestaties wanneer het nodig is
Gebruik Measure-Command
om benaderingen te benchmarken.
Measure-Command {
foreach ($item in $data) { Process-Item $item }
}
PERF-02 Balanceer prestaties en leesbaarheid
- Kleine datasets: focus op leesbaarheid.
- Grote datasets: overweeg streaming of .NET-methoden.
Leesbaar maar minder snel:
$content = Get-Content -Path file.txt
foreach ($line in $content) {
Do-Something -Input $line
}
Geoptimaliseerd voor prestaties:
Get-Content -Path file.txt | ForEach-Object {
Do-Something -Input $_
}
Hoge prestaties met .NET:
$sr = New-Object System.IO.StreamReader "file.txt"
while ($sr.Peek() -ge 0) {
$line = $sr.ReadLine()
Do-Something -Input $line
}
PERF-03 Geef de voorkeur aan taalfeatures boven cmdlets voor snelheid
- Taalconstructies (
foreach
) > .NET-methoden > scripts > cmdlets/pipeline. - Altijd meten voordat je optimaliseert.
Beveiligings Best Practices
Gebruik altijd PSCredential voor inloggegevens
Vermijd platte tekst wachtwoorden. Gebruik [Credential()]
parameters.
param (
[System.Management.Automation.PSCredential]
[System.Management.Automation.Credential()]
$Credential
)
Bij API-gebruik:
$Insecure.SetPassword($Credential.GetNetworkCredential().Password)
Gebruik SecureString voor gevoelige data
Vraag gegevens veilig op en sla ze versleuteld op.
$Secure = Read-Host -Prompt "Voer beveiligde data in" -AsSecureString
Converteer veilig naar platte tekst:
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($Secure)
$PlainText = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
[System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR)
Sla inloggegevens veilig op
Gebruik Export-CliXml
.
Get-Credential | Export-CliXml -Path C:\secure\cred.xml
$Credential = Import-CliXml -Path C:\secure\cred.xml
Versleutelde strings opslaan
ConvertFrom-SecureString -SecureString $Secure | Out-File -Path "${Env:AppData}\secure.bin"
$Secure = Get-Content -Path "${Env:AppData}\secure.bin" | ConvertTo-SecureString
Conclusie
Door deze PowerShell best practices toe te passen op het gebied van ontwerp, documentatie, output, foutafhandeling, prestaties en beveiliging, creëer je robuuste, onderhoudbare en efficiënte scripts. Streef altijd naar een balans tussen leesbaarheid, prestaties en veiligheid om hoogwaardige automatiseringsoplossingen te leveren.