2 min read

PowerShell Scripting and Programming

This guide dives deeper into the programming aspects of PowerShell, moving beyond simple one-liners to robust, reusable scripts and tools.

Parent Topic: PowerShell Comprehensive Guide

1. Script Execution

By default, Windows prevents scripts from running for security reasons.

Execution Policies

  • Restricted: No scripts run. (Default on many systems)
  • RemoteSigned: Scripts created locally run; downloaded scripts must be signed by a trusted publisher. (Recommended)
  • Unrestricted: All scripts run, but you may be prompted before running downloaded scripts.
# Check current policy
Get-ExecutionPolicy

# Set policy (requires Admin)
Set-ExecutionPolicy RemoteSigned

Running Scripts

To run a script in the current directory, you must specify the path (e.g., .\).

.\MyScript.ps1

2. Advanced Functions

You can turn a simple function into a robust tool that behaves like a native cmdlet by adding [CmdletBinding()].

function Get-UserReport {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true, Position=0)]
        [string]$UserName,

        [Parameter(ValueFromPipeline=$true)]
        [string]$Department = "IT"
    )

    process {
        Write-Verbose "Processing user: $UserName"
        return [PSCustomObject]@{
            Name = $UserName
            Dept = $Department
            Date = Get-Date
        }
    }
}
  • [CmdletBinding()]: Enables common parameters like -Verbose, -WhatIf, and -Confirm.
  • [Parameter()]: Defines validation, mandatory status, and pipeline behavior.

3. Input Validation

Ensure your script receives the right data using validation attributes.

param (
    [ValidateSet("Dev", "QA", "Prod")]
    [string]$Environment,

    [ValidateRange(1, 100)]
    [int]$Count,

    [ValidateScript({ Test-Path $_ })]
    [string]$FilePath
)

4. Error Handling

Try-Catch-Finally

Use try-catch blocks to handle exceptions gracefully. Note that only terminating errors are caught, so use -ErrorAction Stop.

try {
    # Stop error allows Catch to trigger
    Get-Item "C:\Missing.txt" -ErrorAction Stop
}
catch [System.IO.FileNotFoundException] {
    Write-Warning "File specifically not found."
}
catch {
    Write-Error "An unexpected error occurred: $_"
}
finally {
    Write-Host "Cleanup operations (runs regardless of error)..."
}

Return to PowerShell Comprehensive Guide