Windows
PowerShell

PowerShell での終了ステータス($?、$LastExitCode) について確認してみた

More than 1 year has passed since last update.

Linux の場合、echo $?と実行することで前回実行コマンドの終了ステータスが取得できるが、PowerShell の場合にどうなるか確認した時のメモ。

参考

確認してみた

$?を参照することで最後に実施した操作の成功・失敗を確認できます。

about_Automatic_Variables

$?

Contains the execution status of the last operation. It contains
TRUE if the last operation succeeded and FALSE if it failed.

直前のコマンドが成功の場合にはTRUEとなり、失敗の場合にはFALSEとなります。
参照はecho $?としても、直接$?としても大丈夫だった。

PS C:\Users\Administrator> echo "test"
test

# 前回のコマンドが成功となったため、True
PS C:\Users\Administrator> echo $?
True

# コマンドを失敗させる
PS C:\Users\Administrator> aaaa
aaaa : The term 'aaaa' is not recognized as the name of a cmdlet, function, script file, or operable program. Check
the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ aaaa
+ ~~~~
    + CategoryInfo          : ObjectNotFound: (aaaa:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

# 前回のコマンドが失敗のため、False
PS C:\Users\Administrator> $?
False

about_Automatic_Variables

$LastExitCode
Contains the exit code of the last Windows-based program that was run.

と書いてある。
微妙に記載が違う。
$LastExitCodeWindows-based program との記載となり、$?execution status of the last operation となっている。

先程の操作を確認してみる。

# PowerShell起動後、何も出力されない
PS C:\Users\Administrator> $LastExitCode
PS C:\Users\Administrator> echo "aaa"
aaa

# 前回のコマンドが成功しても何も出力されない
PS C:\Users\Administrator> $LastExitCode

# コマンドを失敗
PS C:\Users\Administrator> hoge
hoge : The term 'hoge' is not recognized as the name of a cmdlet, function, script file, or operable program. Check
the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ hoge
+ ~~~~
    + CategoryInfo          : ObjectNotFound: (hoge:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

# やはり出力されない
PS C:\Users\Administrator> $LastExitCode
PS C:\Users\Administrator> echo $LastExitCode

なるほど。
PowerShell上のコマンドの結果は$LastExitCodeの値が入らない。

試しに PowerShell のスクリプトを作成してみる。

try{
  hogefuga -ErrorAction stop
} catch {
  exit 1
}

実行して取得。

PS C:\Users\Administrator> .\test.ps1
PS C:\Users\Administrator> echo $LastExitCode
1

取得できた。
$?$LastExitCodeは意味が違うので注意が必要。