powershell-windows は何をしますか?
PowerShell Windowsのパターン集。重要な落とし穴、演算子構文、エラーハンドリング。
目次
演算子の落とし穴
PowerShellでは、C系言語と異なる演算子を使用します。
| 操作 | PowerShell | 間違いやすい例 |
|---|---|---|
| 等価比較 | -eq | == (常に間違い) |
| 代入 | = | 条件式内で = は代入 |
| パターンマッチ | -match, -like | -contains はコレクション用 |
| 論理AND | -and | && (旧バージョン非対応) |
# 間違い
if ($a == $b) { ... } # $a に $b を代入し、常に真
# 正しい
if ($a -eq $b) { ... }
エラーハンドリング
PowerShellのエラーは終了エラーと非終了エラーに分かれます。
- 非終了エラーは
try/catchでキャッチされません。-ErrorAction Stopが必要です。 $Error自動変数はすべてのエラーを蓄積します。適宜クリアしてください。
# 非終了エラーをキャッチする
Try {
Get-Item "C:\Nonexistent" -ErrorAction Stop
} Catch {
Write-Error "ファイルが見つかりません: $_"
}
# $Error のクリア
$Error.Clear()
パイプラインの動作
パイプラインはオブジェクトを渡します。文字列ではありません。
# 間違い: パイプラインを文字列結合に使う
"Hello", "World" | Write-Host
# 正しい: ForEach-Object や -join を使用
"Hello", "World" | ForEach-Object { "アイテム: $_" }
"Hello", "World" -join ", "
よくある間違い
Write-Hostの多用: 出力の制御を妨げます。代わりにWrite-OutputまたはWrite-Verboseを使用。$nullの比較:$null -eq $variableと書く($variable -eq $nullは配列で失敗)。- プロパティの展開忘れ:
(Get-Process).Nameのように括弧で囲む。 - 動的パラメータ: スプラッティング (
@) を使うと可読性が向上。
# 間違い: 位置パラメータの乱用
Get-Process -Name "notepad"
# 正しい: スプラッティング
$params = @{
Name = "notepad"
ErrorAction = "Stop"
}
Get-Process @params
推奨パターン
- 常に
-ErrorAction Stopでエラーをキャッチ可能にする。 Set-StrictMode -Version Latestをスクリプトの先頭に追加する。- レジストリ操作は
-ErrorAction Stopと Try/Catch の組み合わせが安全。 - 外部コマンド呼び出し(例:
net.exe)の終了コードは$LASTEXITCODEで確認する。
# 外部コマンドのエラーチェック
net user TestUser Password123 /add
if ($LASTEXITCODE -ne 0) {
throw "net user コマンドが失敗しました。終了コード: $LASTEXITCODE"
}