スクリプト (CmdletBinding を使用) とコマンドレットにはすべて、呼び出し時に使用できる標準の -ErrorAction パラメーターがあります。実際にスクリプトが -ErrorAction で呼び出された場合、スクリプト内に方法はありますか?
私が尋ねる理由は、スクリプトに関する限り、$ErrorActionPreference の自動変数値が -ErrorAction によって設定されたのか、それともセッション レベルから来ているのかを知りたいからです。
スクリプト (CmdletBinding を使用) とコマンドレットにはすべて、呼び出し時に使用できる標準の -ErrorAction パラメーターがあります。実際にスクリプトが -ErrorAction で呼び出された場合、スクリプト内に方法はありますか?
私が尋ねる理由は、スクリプトに関する限り、$ErrorActionPreference の自動変数値が -ErrorAction によって設定されたのか、それともセッション レベルから来ているのかを知りたいからです。
$ErrorActionPreference
グローバル(セッション)スコープの変数です。スクリプトを実行し、パラメーターを指定しない場合-ErrorAction
、グローバル スコープ ( $global:ErrorActionPreference
) から値が継承されます。
-ErrorAction
パラメーターを指定する$ErrorActionPreference
と、プライベート スコープの が変更されます。つまり、他の何かを指定したコードを実行している間 (たとえば、別の-ErrorAction
値で別のスクリプトを呼び出す場合) を除いて、スクリプト全体で同じままです。テストする例:
Test.ps1
[CmdletBinding()]
param()
Write-Host "Session: $($global:ErrorActionPreference)"
Write-Host "Script: $($ErrorActionPreference)"
出力:
PS-ADMIN > $ErrorActionPreference
Continue
PS-ADMIN > .\Test.ps1
Session: Continue
Script: Continue
PS-ADMIN > .\Test.ps1 -ErrorAction Ignore
Session: Continue
Script: Ignore
PS-ADMIN > $ErrorActionPreference
Continue
スクリプトがパラメータで呼び出されたかどうかをテストしたい場合は、-ErrorAction
ex.
if ($global:ErrorActionPreference -ne $ErrorActionPreference) { Write-Host "changed" }
スコープがわからない場合は、powershell コンソールに次のように入力します。Get-Help about_scopes
$MyInvocation.BoundParameters オブジェクトを確認してください。組み込みの $PSBoundParameters 変数を使用できますが、場合によっては空であることがわかりました (この質問とは直接関係ありません)。そのため、$MyInvocation を使用する方が安全です。
function Test-ErrorAction
{
param()
if($MyInvocation.BoundParameters.ContainsKey('ErrorAction'))
{
'The ErrorAction parameter has been specified'
}
else
{
'The ErrorAction parameter was not specified'
}
}
Test-ErrorAction
-ErrorAction
コマンドレットがパラメーターで呼び出されたかどうかを知る必要がある場合は、次のようにします。
[CmdletBinding()]
param()
if ($myinvocation.Line.ToLower() -match "-erroraction" )
{
"yessss"
}
else
{
"nooooo"
}
これはtrue
、パラメーターがグローバルと同じ値を持つ場合にも当てはまります。$ErrorActionPreference