はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【PowerShell】いつも書くおまじないメモ(shebang, version指定, errorの扱い)

はじめに

私はPowerShellを書くときに、以下のコードをおまじない的にいつも記述しています。

#!/usr/bin/env pwsh
#Requires -Version 7.4

# Paramに関する記述

$PSNativeCommandUseErrorActionPreference = $true
$ErrorActionPreference = "Stop"

このコードのついて今回は書いていきます。

解説

#!/usr/bin/env pwsh

まずはshebang(シェバン)の設定です。こうすることでスクリプトをPowerShell Coreで実行することを指定します。

これがあればchmod +x ./test.ps1のように実行権限を与えることで、シームレスにスクリプトを実行できます。

$ ./test.ps1

#Requires -Version 7.4

これを記述することで、スクリプトがPowerShell 7.4以上で実行されることを保証します。

なぜPowerShell 7.4以上に固定するのかというと、この後理由を説明します。

$PSNativeCommandUseErrorActionPreference = $true

ネイティブコマンド(PowerShell以外のコマンド、例えばgitやcurlなど)に対して、0以外の終了コードであった場合に$ErrorActionPreferenceの設定を適用するためのものです。PowerShell 7.4以降にデフォルトがfalseになっています。

$PSNativeCommandUseErrorActionPreferenceが$trueされると、0 以外の終了コードを持つネイティブ コマンドは、$ErrorActionPreferenceに従ってエラーを発行します。

learn.microsoft.com

デフォルトでは、ネイティブコマンドがエラーを返しても、PowerShellはそれをエラーとして扱わず、スクリプトの実行を続行してしまいます。そこで$PSNativeCommandUseErrorActionPreference = $trueを設定すると、ネイティブコマンドがエラーを返した場合に、$ErrorActionPreferenceの設定に従ってエラーハンドリングが行われます。

$ErrorActionPreference = "Stop"

$ErrorActionPreferenceは、PowerShellのエラーハンドリングの動作を制御するための変数です。この変数は、コマンドレットやスクリプトがエラーを発生させたときにどのように動作するかを指定します。

PowerShell が終了しないエラー (コマンドレットの処理を停止しないエラー) に応答する方法を決定します。 たとえば、コマンド ラインやスクリプト、コマンドレット、プロバイダーなど、 Write-Error コマンドレットによって生成されたエラーなどです。

learn.microsoft.com

どんな設定があるのかは公式ドキュメントを確認してほしいですが、デフォルトだとContinueであり、エラー メッセージが表示され、実行が続行されます。

$ErrorActionPreference = "Stop"を設定すると、コマンドレットやスクリプトがエラーを発生させた場合にスクリプトの実行が停止します。