脚本(使用 CmdletBinding)和 cmdlet 在调用时都有一个可用的标准 -ErrorAction 参数。如果确实使用-ErrorAction调用了您的脚本,那么在您的脚本中是否有办法?
我问的原因是因为我想知道 $ErrorActionPreference 的自动变量值,就您的脚本而言,是由 -ErrorAction 设置的,还是来自您的会话级别。
脚本(使用 CmdletBinding)和 cmdlet 在调用时都有一个可用的标准 -ErrorAction 参数。如果确实使用-ErrorAction调用了您的脚本,那么在您的脚本中是否有办法?
我问的原因是因为我想知道 $ErrorActionPreference 的自动变量值,就您的脚本而言,是由 -ErrorAction 设置的,还是来自您的会话级别。
$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
检查 $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
参数调用了 cmdlet,请执行以下操作:
[CmdletBinding()]
param()
if ($myinvocation.Line.ToLower() -match "-erroraction" )
{
"yessss"
}
else
{
"nooooo"
}
这也是true
当参数具有与全局相同的值时$ErrorActionPreference