gpt4 book ai didi

powershell - 如果出现错误,我如何使用 try...catch 并让我的脚本停止?

转载 作者:行者123 更新时间:2023-12-04 05:07:14 24 4
gpt4 key购买 nike

我试图让我的脚本在遇到错误时停止,并使用 try... catch 为我提供一种处理错误的简单方法。我曾想过世界上最简单的事情,但我显然在做一些愚蠢的事情。我已经阅读了几个小时,但我被卡住了,任何帮助都会非常方便,谢谢!

这是一些示例代码,我把 erroraction 放在了所有地方,似乎无法阻止该死的事情!

$ErrorActionPreference = "Stop"
try {
get-content "c:\GarbageFileName.txt" -ErrorAction stop
}
catch {
write-output "in catch, I want it to stop now"
}
write-output "try-catch finished, script is continuing"

第二天添加此文本 *
来自人们的精彩答案,我希望我可以选择 1 个以上的答案,或者有足够的声誉来投票给那些我不情愿没有选择作为答案的答案,或者以某种方式说声谢谢!

最佳答案

一个的整个想法尝试/捕捉 控制是告诉脚本如果遇到终止错误该怎么做,而不是抛出错误并停止脚本的默认操作。如果您的 catch 块只是向终端显示一条消息 写主机 ,这就是所有的错误处理,脚本将从那里继续。如果你仔细想想,它会部分地违背 的目的。尝试/捕捉 如果在捕获错误时脚本自动停止。

捕获 块, $_ 将设置为 ErrorRecord 对象,表示来自 的终止错误试试 块(与存储在 $error[0] 中的块相同)。因此,结束脚本的最简单方法是重新抛出如果您没有使用 就会抛出的错误。尝试/捕捉 :

try {
Get-Content "c:\GarbageFileName.txt" -ErrorAction stop
} catch {
# Custom action to perform before terminating
throw $_
}

或者,如果要显示自定义消息而不是默认的 ErrorRecord:
try {
Get-Content "c:\GarbageFileName.txt" -ErrorAction stop
} catch {
throw 'Custom error message'
}

或者你可以使用 中断 如果您想在完成自定义错误处理后退出而不向错误流抛出错误,则如 Joost 的回答中所建议的那样。

或者您可以变得更复杂并创建您自己的 ErrorRecord 对象。你可以用它做很多事情,这个话题太大,无法在这里全面涵盖,但你可以通过谷歌搜索 获得有关语法的更多信息。 System.Management.Automation.ErrorRecord .这是我的一个脚本中的一个示例,可帮助您入门(从执行 $query 变量中针对 SQL Server 数据库定义的 SQL 查询的函数):
} catch {
$ErrorRecord = New-Object System.Management.Automation.ErrorRecord(
(New-Object Exception("Exception executing the query: $($_.Exception.InnerException.Message)")),
$query,
[System.Management.Automation.ErrorCategory]::InvalidArgument,
$null
)
$ErrorRecord.CategoryInfo.Reason = $_.CategoryInfo.Reason;
$ErrorRecord.CategoryInfo.Activity = $_.InvocationInfo.InvocationName;
$PSCmdlet.ThrowTerminatingError($ErrorRecord);
}

一些注意事项:
  • 您会看到,在创建我的自定义 ErrorRecord 时,我使用的是 $_ ,我刚刚说它包含与在 中捕获的终止错误相关联的 ErrorRecord 对象。试试 堵塞。这个想法是自定义一些错误输出,同时通过将它们分配给自定义 ErrorRecord 的相应属性来使用默认 ErrorRecord 的部分。
  • $PSCmdlet 仅当您声明 [CmdletBinding()] 时才可用在函数或脚本的开头。否则,您可以使用 throw $ErrorRecord抛出您的自定义错误。但是,如果您使用 ,结果将更像 Cmdlet 风格。 $PSCmdlet.ThrowTerminatingError . ( throw 会从产生错误的函数中吐出一行,而 $PSCmdlet.ThrowTerminatingError 会给你从调用上下文中使用该函数的行。这很难以一种合理的方式进行描述,而不会过于复杂,但是如果您尝试一下,您就会明白我的意思。)

  • 顺便说一句,设置 $ErrorActionPreference = "Stop" 是多余的,然后使用 -ErrorAction Stop .首选项变量设置所有 cmdlet 的默认操作, -ErrorAction switch 覆盖特定 cmdlet 的默认操作,因此无需先指定默认值,然后使用 -ErrorAction 指定您刚刚设置为默认值的相同操作。您可能想要做的只是忽略 $ErrorActionPreference = "Stop" .

    关于powershell - 如果出现错误,我如何使用 try...catch 并让我的脚本停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19282870/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com