gpt4 book ai didi

powershell - 如何捕获未找到文件的错误?

转载 作者:行者123 更新时间:2023-12-02 16:20:45 25 4
gpt4 key购买 nike

我正在使用 Powershell 并尝试使用删除项目。通常,该文件不会出现在我的场景中,并且会生成错误并在输出中出现 6 行红色文本。这非常具有破坏性,我不想看到这种情况发生。但是,如果存在任何其他类型的错误,例如文件由于正在使用而无法删除,那么我想查看该错误。我想我可以使用两个 catch 语句:一个带有 [filenotfoundexception] 或类似的东西,另一个没有异常类型来获取其他所有内容。但是,错误文本中的任何代码都不能用作异常类型:“无法找到类型”。处理这个问题的正确方法是什么?

最佳答案

为确保错误进入 catch block ,请包含 -ErrorAction Stop

要查找错误的类型,捕获错误并检索异常的类型:

try {
Remove-Item -Path 'c:\IDoNotExist.txt' -ErrorAction Stop
} catch {
$_.Exception.GetType().FullName
}

要捕获特定类型的错误:

try {
Remove-Item -Path 'c:\IDoNotExist.txt' -ErrorAction Stop
} catch [System.Management.Automation.ItemNotFoundException] {
"Specific Exception Caught"
}

Uncaught Error 仍将按照正常行为显示为 write-error 输出。

有关 PowerShell 中异常的额外信息

如果您想捕获所有异常,但以不同方式处理其他异常,则可以包含默认捕获:

try {
Remove-Item -Path 'c:\IDoNotExist.txt' -ErrorAction Stop
} catch [System.DivideByZeroException] {
"Specific Exception Caught"
} catch {
"Generic Exception Caught"
}

您可以为其他异常类型添加其他 catch block 。如果您捕获了异常类型及其父类(super class),则父类(super class) catch 必须稍后出现(否则父类(super class)将捕获异常,并且后面的 catch block 将永远不会被使用)。例如这是有效的:

try {
Remove-Item -Path 'c:\IDoNotExist.txt' -ErrorAction Stop
} catch [System.Management.Automation.ItemNotFoundException] {
"[System.Management.Automation.ItemNotFoundException]"
} catch [System.Exception] {
"[System.Exception]"
}

...虽然这不是:

try {
Remove-Item -Path 'c:\IDoNotExist.txt' -ErrorAction Stop
} catch [System.Exception] {
"[System.Exception]"
} catch [System.Management.Automation.ItemNotFoundException] {
"[System.Management.Automation.ItemNotFoundException]"
}

最后还有finally block ;正如您在 C# 和许多其他语言中可能熟悉的那样:

try {
Remove-Item -Path 'c:\IDoNotExist.txt' -ErrorAction Stop
} catch [System.Management.Automation.ItemNotFoundException] {
"[System.Management.Automation.ItemNotFoundException]"
throw #though we caught the exception we're now rethrowing it. This is useful in scenarios such as where we want to log that an exception's occurred, but still allow the exception to bubble up to a higher layer
} catch [System.Exception] {
"[System.Exception]"
} finally {
"Always do this after a try/catch, regardless of whether there was an error, we caught the error, or we rethrew the error"
}
"If any uncaught error exists (i.e. including rethrown errors from the catch block) we won't reach this... If there were no errors or all errors were handled and not rethrown, we will"

旁注:还有一种称为 trap 的东西用于处理异常...有关此博客上所有这些内容的更多信息。 https://blogs.msdn.microsoft.com/kebab/2013/06/09/an-introduction-to-error-handling-in-powershell/

关于powershell - 如何捕获未找到文件的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48857542/

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