Powershell:检查是否使用-ErrorAction调用了脚本?

时间:2013-01-20 19:10:38

标签: powershell

脚本(带有CmdletBinding)和cmdlet在调用时都有一个标准的-ErrorAction参数。有没有办法在你的脚本中,如果你的脚本确实是用-ErrorAction调用的?

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

3 个答案:

答案 0 :(得分: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

如果您想测试脚本是否使用-ErrorAction参数调用,您可以使用ex。

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

如果您不知道范围是什么,请在powershell控制台中输入:Get-Help about_scopes

答案 1 :(得分: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

答案 2 :(得分:0)

如果您需要知道是否使用-ErrorAction参数调用了cmdlet,请执行以下操作:

[CmdletBinding()]
param()

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

当参数与全局true

具有相同的值时,这是$ErrorActionPreference