脚本(带有CmdletBinding)和cmdlet在调用时都有一个标准的-ErrorAction参数。有没有办法在你的脚本中,如果你的脚本确实是用-ErrorAction调用的?
我问的原因是因为我想知道$ ErrorActionPreference的自动变量值,就脚本而言,是由-ErrorAction设置还是来自会话级别。
答案 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