从不同范围引用当前对象



我希望能够从我在 catch 块中调用的函数引用 catch 块中的$_对象,如下所示:

function foo
{
$something = ((Get-Variable -Name "_" -Scope 1).Value).Exception.Message
Write-Host $something
}

我想在以下情况下使用它:

foo #write-host should print empty line
try {
throw
} catch {
foo #write-host should print $_.Exception.Message from this catch block
}

如何正确地做到这一点? 目标是避免每次在 catch 块中使用它时$_作为参数传递给foo,并且在我不在 catch 块中调用foo时不打印任何内容。

我也试过这个:

function foo
{
$something = (($ExecutionContext.SessionState.PSVariable.Get("_")).Value).Exception.Message
Write-Host $something
}

这似乎在交互式工作时产生了我想要的结果,但在启动脚本时却没有。

这样做的干净方法是,当然,foo上的一个(可选(参数,使用来自catch块的foo $_调用。这使得我们非常清楚我们称之为foo,它在范围界定方面没有问题,它使foo可测试,所有这些都很好。您将在大多数打印错误的内容中看到这种方法(例如,在这个问题的答案中(。

即便如此,如果您坚持从父帧中获取错误变量,也可以这样做:

function foo {
$lastError = (Get-PSCallStack)[1].GetFrameVariables()["_"].Value
if ([Object]::ReferenceEquals($lastError.Exception, $error[0].Exception)) {
$lastError.Exception.Message
}
}

请注意Object.ReferenceEquals的额外技巧,以绝对确定$_指的是最后一个错误记录,而不是一些任意管道项目(也使用$_(。如果错误记录本身在管道中,这仍然会失败(例如$error |% { foo }(,但在这一点上,您不妨将其称为功能。

相关内容

  • 没有找到相关文章

最新更新