PowerShell Windows Patterns
Critical patterns and pitfalls for Windows PowerShell.
- Operator Syntax Rules CRITICAL: Parentheses Required ❌ Wrong ✅ Correct if (Test-Path "a" -or Test-Path "b") if ((Test-Path "a") -or (Test-Path "b")) if (Get-Item $x -and $y -eq 5) if ((Get-Item $x) -and ($y -eq 5))
Rule: Each cmdlet call MUST be in parentheses when using logical operators.
- Unicode/Emoji Restriction CRITICAL: No Unicode in Scripts Purpose ❌ Don't Use ✅ Use Success ✅ ✓ [OK] [+] Error ❌ ✗ 🔴 [!] [X] Warning ⚠️ 🟡 [*] [WARN] Info ℹ️ 🔵 [i] [INFO] Progress ⏳ [...]
Rule: Use ASCII characters only in PowerShell scripts.
- Null Check Patterns Always Check Before Access ❌ Wrong ✅ Correct $array.Count -gt 0 $array -and $array.Count -gt 0 $text.Length if ($text) { $text.Length }
- String Interpolation Complex Expressions ❌ Wrong ✅ Correct "Value: $($obj.prop.sub)" Store in variable first
Pattern:
$value = $obj.prop.sub Write-Output "Value: $value"
- Error Handling ErrorActionPreference Value Use Stop Development (fail fast) Continue Production scripts SilentlyContinue When errors expected Try/Catch Pattern Don't return inside try block Use finally for cleanup Return after try/catch
- File Paths Windows Path Rules Pattern Use Literal path C:\Users\User\file.txt Variable path Join-Path $env:USERPROFILE "file.txt" Relative Join-Path $ScriptDir "data"
Rule: Use Join-Path for cross-platform safety.
- Array Operations Correct Patterns Operation Syntax Empty array $array = @() Add item $array += $item ArrayList add `$list.Add($item)
- JSON Operations CRITICAL: Depth Parameter ❌ Wrong ✅ Correct ConvertTo-Json ConvertTo-Json -Depth 10
Rule: Always specify -Depth for nested objects.
File Operations
Operation Pattern
Read Get-Content "file.json" -Raw
Write$data
9. Common Errors
Error Message Cause Fix
"parameter 'or'" Missing parentheses Wrap cmdlets in ()
"Unexpected token" Unicode character Use ASCII only
"Cannot find property" Null object Check null first
"Cannot convert" Type mismatch Use .ToString()
10. Script Template
Strict mode
Set-StrictMode -Version Latest $ErrorActionPreference = "Continue"
Paths
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
Main
try { # Logic here Write-Output "[OK] Done" exit 0 } catch { Write-Warning "Error: $_" exit 1 }
Remember: PowerShell has unique syntax rules. Parentheses, ASCII-only, and null checks are non-negotiable.