4

スクリプト (CmdletBinding を使用) とコマンドレットにはすべて、呼び出し時に使用できる標準の -ErrorAction パラメーターがあります。実際にスクリプトが -ErrorAction で呼び出された場合、スクリプト内に方法はありますか?

私が尋ねる理由は、スクリプトに関する限り、$ErrorActionPreference の自動変数値が -ErrorAction によって設定されたのか、それともセッション レベルから来ているのかを知りたいからです。

4

3 に答える 3

4

$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

スクリプトがパラメータで呼び出されたかどうかをテストしたい場合は、-ErrorActionex.

if ($global:ErrorActionPreference -ne $ErrorActionPreference) { Write-Host "changed" }

スコープがわからない場合は、powershell コンソールに次のように入力します。Get-Help about_scopes

于 2013-01-20T19:43:03.153 に答える
3

$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
于 2013-01-20T21:40:54.410 に答える
0

-ErrorActionコマンドレットがパラメーターで呼び出されたかどうかを知る必要がある場合は、次のようにします。

[CmdletBinding()]
param()

if ($myinvocation.Line.ToLower() -match "-erroraction" )
    {
      "yessss"
    }
else
    {
      "nooooo"
    }

これはtrue、パラメーターがグローバルと同じ値を持つ場合にも当てはまります。$ErrorActionPreference

于 2013-01-20T21:09:29.683 に答える