Powershell 如何在脚本块中捕获异常?

Powershell 如何在脚本块中捕获异常?,powershell,powershell-4.0,Powershell,Powershell 4.0,我正在尝试在库函数中使用脚本块。我希望确保能够可靠地检测所提供的脚本块中的运行时错误,并将其报告回来。在下面的示例中,我创建了一个导致运行时错误的脚本块 我的期望是catch块将捕获它并打印错误消息。这种情况不会发生。它以红色文本将错误转储到控制台,但控制根本不传递到catch块 $cmd = [ScriptBlock]::Create("Get-Content doesnotexist.txt") $results = '' try { $results = & $cmd

我正在尝试在库函数中使用脚本块。我希望确保能够可靠地检测所提供的脚本块中的运行时错误,并将其报告回来。在下面的示例中,我创建了一个导致运行时错误的脚本块

我的期望是catch块将捕获它并打印错误消息。这种情况不会发生。它以红色文本将错误转储到控制台,但控制根本不传递到catch块

$cmd = [ScriptBlock]::Create("Get-Content doesnotexist.txt")

$results = ''

try {
    $results = & $cmd
}
catch {
    $results += "Error: $($_.Exception.Message)"
}

"Results: $results"

Results:

PS:>

有人能帮我找出这个例子中的错误吗?

我不太清楚你为什么要这样做。如果发生错误,您将希望显示错误,因此只需让错误发生在
catch
中,然后如果结果不等于
null
,则让它显示正确的结果

$cmd = [ScriptBlock]::Create("Get-Content doesnotexist.txt")

$results = ''

try {
    $results = & $cmd
}
catch {
    write-error $_
}

if($results -ne $null){
    write-host "Results: $results"
}
<#else{
    #Error handling here, or have this action happen in the catch
}#>
$cmd=[ScriptBlock]::Create(“Get Content doesnotexist.txt”)
$results=''
试一试{
$results=&$cmd
}
抓住{
写入错误$_
}
如果($results-ne$null){
编写主机“结果:$Results”
}

我同意有几种方法可以处理此消息。问题是这个错误根本不会调用catch块。这就是我一直坚持的部分。也许你需要把try/catch放在你的脚本块中?我相信只有当它是一个终止错误时,它才会起作用,所以您可能只需要做一些事情,比如测试路径和后续的if语句来处理它。我想如果我知道确切的用例,就更容易为您指出正确的方向。try catch only处理终止错误
$cmd=[ScriptBlock]::Create(“Get Content doesnotexist.txt-ErrorAction Stop”)
查看此和此@MartinMaat您引用的帖子包含了我需要的信息。continue的默认错误操作是我的try-catch被绕过的原因。如果我将其更改为停止,它将按我预期的方式工作。@Matt这正是我解决此脚本问题所需的信息。请将此作为答案发布,以便我可以接受。如果我找不到一个好的副本(因为我确信有一个),我会在这里添加一个正确的答案。这里的区别在于,您显然在使用scriptblock,但问题不在于此。