从不同的范围引用当前对象
Referring to current object from different scope
我希望能够从我在 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
}
这似乎在交互式工作时产生了我想要的结果,但在启动脚本时却没有。
执行此操作的 clean 方法当然是 foo
上的一个(可选)参数,从 [=13= 调用 foo $_
] 块。这非常清楚我们调用 foo
的目的,它没有范围界定问题,它使 foo
可测试,所有这些好处。您会在大多数打印错误的地方看到这种方法(例如 this question 的答案)。
即使如此,如果您坚持从父框架中提取错误变量,也可以做到:
function foo {
$lastError = (Get-PSCallStack)[1].GetFrameVariables()["_"].Value
if ([Object]::ReferenceEquals($lastError.Exception, $error[0].Exception)) {
$lastError.Exception.Message
}
}
请注意 Object.ReferenceEquals
的额外技巧,以确保 $_
指的是最后一个错误记录,而不是某个任意管道项(也使用 $_
)。如果错误记录本身在管道中(例如 $error |% { foo }
),这将 仍然 失败,但此时您不妨将其称为功能。
我希望能够从我在 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
}
这似乎在交互式工作时产生了我想要的结果,但在启动脚本时却没有。
执行此操作的 clean 方法当然是 foo
上的一个(可选)参数,从 [=13= 调用 foo $_
] 块。这非常清楚我们调用 foo
的目的,它没有范围界定问题,它使 foo
可测试,所有这些好处。您会在大多数打印错误的地方看到这种方法(例如 this question 的答案)。
即使如此,如果您坚持从父框架中提取错误变量,也可以做到:
function foo {
$lastError = (Get-PSCallStack)[1].GetFrameVariables()["_"].Value
if ([Object]::ReferenceEquals($lastError.Exception, $error[0].Exception)) {
$lastError.Exception.Message
}
}
请注意 Object.ReferenceEquals
的额外技巧,以确保 $_
指的是最后一个错误记录,而不是某个任意管道项(也使用 $_
)。如果错误记录本身在管道中(例如 $error |% { foo }
),这将 仍然 失败,但此时您不妨将其称为功能。