Powershell Safe Invocation
Use when writing or running PowerShell on Windows, especially native programs, quoted...
Install
npx skills add OpenBMB/PilotDeck --skill powershell-safe-invocation -g -a claude-code -y- Repository
- OpenBMB/PilotDeck4.9k
- Category
- Writing
- Updated
- 6d ago
- License
- AGPL-3.0
- Context cost
- Lightabout 999 tokens
- Runs scripts
- No, instructions only
What it does
Use when writing or running PowerShell on Windows, especially native programs, quoted paths, escaping, pwsh, Start-Process, file operations, or shell troubleshooting.
PowerShell Safe Invocation
Shell
Use PowerShell 7 through pwsh.exe unless Windows PowerShell 5.1 is explicitly required.
When the active shell is uncertain, verify:
$PSVersionTable.PSVersion
$PSNativeCommandArgumentPassing
Do not assume installing PowerShell 7 makes powershell.exe use PowerShell 7:
pwsh.exe= PowerShell 7powershell.exe= Windows PowerShell 5.1
Native Programs
Never construct one large command string when arguments can be passed separately.
Use:
$exe = 'C:\Path With Spaces\tool.exe'
$args = @(
'--input'
'C:\Data Folder\input.json'
'--flag'
)
& $exe @args
$exitCode = $LASTEXITCODE
if ($exitCode -ne 0) {
throw "$exe failed with exit code $exitCode"
}
Rules:
- Treat every native argument as one array item.
- Invoke executable paths stored in variables with
&. - Capture
$LASTEXITCODEimmediately. - Do not use
Invoke-Expression. - Do not add a
cmd.exe /clayer merely to launch an executable. - Do not use Bash-style
\"escaping in PowerShell.
Cmdlets
Use hashtable splatting for PowerShell cmdlets:
$params = @{
LiteralPath = 'C:\Data[1]\input.txt'
Destination = 'C:\Output'
Force = $true
ErrorAction = 'Stop'
}
Copy-Item @params
Use -LiteralPath for real paths unless wildcard expansion is intentional.
Do not use $LASTEXITCODE to test a PowerShell cmdlet. Use terminating errors:
$ErrorActionPreference = 'Stop'
Complex Commands
Avoid deeply quoted commands such as:
cmd.exe /c pwsh.exe -Command "..."
For multiline code, nested quotes, JSON, XML, regular expressions, pipelines, redirection, or non-ASCII paths:
- Write a temporary
.ps1file. - Execute it with:
pwsh.exe -NoLogo -NoProfile -NonInteractive -File script.ps1
Prefer -File over -Command for anything beyond a short, simple expression.
