4

脚本(使用 CmdletBinding)和 cmdlet 在调用时都有一个可用的标准 -ErrorAction 参数。如果确实使用-ErrorAction调用了您的脚本,那么在您的脚本中是否有办法?

我问的原因是因为我想知道 $ErrorActionPreference 的自动变量值,就您的脚本而言,是由 -ErrorAction 设置的,还是来自您的会话级别。

4

3 回答 3

4

$ErrorActionPreference是全局(会话)范围内的变量。如果您运行脚本但未指定-ErrorAction参数,它会从全局范围 ( ) 继承值$global:ErrorActionPreference

如果您指定-ErrorAction参数,$ErrorActionPreference则会针对您的私有范围进行更改,这意味着它在脚本中保持不变,除非在运行您指定其他内容的代码时(例如,您使用另一个-ErrorAction值调用另一个脚本)。测试示例:

测试.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

于 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参数调用了 cmdlet,请执行以下操作:

[CmdletBinding()]
param()

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

这也是true当参数具有与全局相同的值时$ErrorActionPreference

于 2013-01-20T21:09:29.683 回答