PowerShell Scripting Best Practices Gids

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.

タイトルとURLをコピーしました