PowerShell の LastExitCode
 
エラーハンドリングの細かい点を理解することは、PowerShell での効果的なスクリプティングに不可欠です。さまざまなツールの中で、$LastExitCode は外部コマンドの終了コードをキャプチャするための強力なメカニズムとして際立っています。
この記事では、基本的なエラーチェックから動的コマンド実行まで、さまざまなシナリオにおける $LastExitCode の微妙な使用法を掘り下げます。$LastExitCode をマスターすることで、PowerShell ユーザーはスクリプトの堅牢性と信頼性を高めることができます。
PowerShell 環境における $? の使用
ここで使用する前に、$? コマンドを理解することが重要です。PowerShell では、$? は自動変数で、最後の操作の成功または失敗を判断するのに役立ち、エラーハンドラーとして使用できます。
最後に実行されたコマンドに基づいて、ブール値 True または False を返します。スクリプト内で最後に実行されたコマンドが成功すれば true を返し、そうでなければ false を返します。
このコマンドの一回の実行が下記の実行コードに示されています。
Remove-Item -Path "example.txt"
if ($?) {
    Write-Host "File removed successfully."
}
else {
    Write-Host "Failed to remove file."
}
この例では、まず example.txt という名前のファイルを削除しようとします。Remove-Item コマンドを実行した後、if 文内で $? 変数を使用して、操作が成功したかどうかを確認します。
もし $? が True であれば、成功メッセージを表示し、そうでなければ失敗メッセージを表示します。

$lastexitcode と $? には違いがあります。ただし、どちらもエラーハンドリングに使用されます。
PowerShell におけるエラーハンドラーとしての $LastExitCode
コマンドが内部である場合と外部である場合では、使用されるエラーハンドリングに違いがあります。
コマンドが外部である場合、$lastexitcode を使用します。これは、このコマンドが外部スクリプトおよびコマンドにのみ適用されるからです。
$LastExitCode の主な目的は、PowerShell セッション内で実行された外部コマンドの成功または失敗についてフィードバックを提供することです。$LastExitCode にアクセスすることで、ユーザーは最後に実行されたコマンドが成功したかエラーに遭遇したかを判断できます。
例:
# Execute an external command (ping)
ping example.test
# Check the value of $LastExitCode
$exitCode = $LastExitCode
# Output the exit code
Write-Host "Exit code: $exitCode"
この例では、example.test というホストに ping を実行しようとします。ping コマンドを実行した後、$LastExitCode の値を $exitCode という変数に格納します。
最後に、Write-Host コマンドレットを使用して終了コードを出力します。このアプローチにより、PowerShell スクリプト内で直接最後に実行されたコマンドの終了コードにアクセスし、利用することができます。
出力:

PowerShell におけるエラーハンドラーとしての Invoke-Expression を用いた $LastExitCode
PowerShell では、Invoke-Expression コマンドレットにより、文字列変数に格納されたコマンドやスクリプトを実行できます。$LastExitCode と組み合わせることで、動的に実行されたコマンドの終了コードをキャプチャする方法を提供します。
例:
# Define a command as a string
$command = "ping example.test"
# Execute the command using Invoke-Expression
Invoke-Expression -Command $command
# Capture the exit code using $LastExitCode
$exitCode = $LastExitCode
# Output the exit code
Write-Host "Exit code: $exitCode"
この例では、ping example.test というコマンドを文字列変数 $command として定義します。次に、Invoke-Expression を使用して $command に格納されたコマンドを実行します。
実行後、$LastExitCode を使用して終了コードをキャプチャし、変数 $exitCode に格納します。最後に、終了コードをコンソールに出力します。
出力:

前のスクリプトが true だった場合、$LastExitCode の出力は常に 0 になります。
しかし、失敗した場合、1 または外部スクリプトが返す他の整数が返されます。なぜなら、$LastExitCode コマンドはバイナリではなく、$? コマンドとは異なるからです。
PowerShell におけるエラーハンドラーとしての条件チェックを用いた $LastExitCode
条件文は、PowerShell スクリプト内でコマンドの成功または失敗に基づいて意思決定を行うことを可能にします。これらの文内で $LastExitCode を活用して、堅牢なエラーハンドリングや条件ロジックを実装する方法を見てみましょう。
例:
# Execute an external command (ping)
ping example.test
# Check the value of $LastExitCode
if ($LastExitCode -eq $null) {
    Write-Host "No exit code available. An external command might not have been executed."
}
else {
    Write-Host "Exit code: $LastExitCode"
}
この例では、example.test というホストに ping を試みます。ping コマンドを実行した後、$LastExitCode の値を確認します。
もし $LastExitCode が null であれば、ping コマンドが実行されなかったことを示し、無効なホスト名やネットワークの問題が考えられます。さもなければ、ping コマンドの成功または失敗についての洞察を提供する終了コードを出力します。
出力:

結論
この記事では、PowerShell スクリプティングにおけるエラーハンドラーとしての $LastExitCode の利用について包括的な概要を提供しました。$? を用いた基本的なエラーチェック、$LastExitCode を用いた外部コマンドのエラーハンドリング、Invoke-Expression を用いた動的コマンド実行、および条件チェックなど、さまざまな文脈での使用法を探りました。
これらの技術をマスターすることで、PowerShell ユーザーはスクリプトの堅牢なエラーモニタリングとハンドリングを確実にし、スクリプティング機能を向上させることができます。さらなる理解を深めるために、エラートラッピングや特定のエラーシナリオのハンドリングなどの高度なトピックを探索することを検討してください。
PowerShell でのエラーハンドリング技術をしっかりと把握すれば、さまざまな自動化タスクのための信頼性が高く、回復力のあるスクリプトを開発するための準備が整います。
Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.
