当前位置: 首页 > 知识库问答 >
问题:

PowerShell:捕获错误,但继续没有循环?

樊桐
2023-03-14

我喜欢认为我很擅长PowerShell,但我在这里有点困惑。

我有一个巨大的文件列表,我将在上面运行此代码,这将给我一些必要的文件信息,我将运行分析。第一步就是获取文件列表。所以我运行这个。

Get-ChildItem $path -Recurse

这返回了一堆无用的信息,但也给了我一片红色的海洋。有大量的文件和文件夹无法找到,并明确拒绝我。我想捕获所有这些错误,以便将它们解析为相关信息,因此我的直觉告诉我使用Try/catch。

通常情况下,您使用try/Catch将错误html" target="_blank">消息存储在循环之外的某个循环中,这非常有效。但是我实际上没有一个循环可以继续。我不确定现在该怎么办。这是我的源代码。

function Get-FileInfo {
    Param(
        [Parameter(Mandatory=$True,Position=0)]
        [ValidateNotNull()]
        [string]$path
    )

    $global:errorInfo = @()
    Write-Host "I started!"

    Try {
        Write-Host "I started the Try Statement!"
        $fileInfo = Get-ChildItem $path -Recurse -ErrorAction Stop
        Write-Host "I finished the main pull!"
        Return $fileInfo
    }

    Catch {
        Write-Host "I started the Catch Statement!"
        $errorObj = New-Object PSObject
        Add-Member -inputObject $errorObj -memberType NoteProperty -name “Type” -value $_.Exception.Message
        Add-Member -inputObject $errorObj -memberType NoteProperty -name “Item” -value $_.Exception.ItemName
        $errorInfo += $errorObj
        Continue
    }

}

我相信你看到了问题所在。我想捕获Try块中不可避免的错误,但实际上我没有循环。我真的不知道如何将其设置为一个循环,以使事情变得更好。

如果我运行这段代码,它会写“我开始了!”然后“我开始尝试声明”几乎就在那之后。然后它会工作大约一分钟。然后我得到一个“我开始了捕获声明!”它马上就结束了。这是有道理的,但这显然不是预期的结果。

我只是想错了吗?

共有1个答案

孙风畔
2023-03-14

您描述的错误是非终止错误,您可以使用通用的-ErrorVariable参数将其收集到变量中,而无需在第一个错误时停止命令(这就是-ErrorAction Stop所做的)。

# Silence non-terminating errors and collect them in variable $errs
Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs

>

  • 通常最好避免设置跨越范围边界的变量,但也可以将变量作为脚本范围/全局范围的目标,即使用
    -ErrorVariable-script:errs/-ErrorVariable-global:errs

要使错误静音,请使用-ErrorAction SilentlyContinue,而不是-ErrorAction Ignore——后者将完全抑制错误,使$errs为空。

 类似资料:
  • 本文向大家介绍浅谈PowerShell 捕获错误,包括了浅谈PowerShell 捕获错误的使用技巧和注意事项,需要的朋友参考一下 之前的文章我们演示了如何使用 Windows PowerShell 构建相当高级的清单工具。我创建的工具提供了多个有关输出的选项,这应归功于外壳的内置功能和将函数应用于对象。 我所创建的函数有一个无可否认的弱点:它不能适度处理可能发生的任何错误(例如连接或权限问题)。

  • 问题内容: 一旦在此代码中捕获到异常,该方法就会运行,但是一旦我输入一个数字,程序就会关闭,并显示“生成成功”消息。一旦发生异常,是否有任何方法可以返回while循环? 问题答案: 将 try / catch 放入 while循环中 :

  • EDIT应该返回true或false,但它的抛出错误

  • 我想捕捉和处理非终止错误,但使用-ErrorAction SilentlyContinue。我知道我需要使用-ErrorAction-Stop来捕获非终止错误。该方法的问题是,我不希望try脚本块中的代码实际停止。我希望它继续,但处理非终止错误。我也希望它保持沉默。这可能吗?也许我走错了方向。 我想处理的非终止性错误的一个例子是从Get-Childitem访问关键字文件夹的拒绝访问错误。这是一个例

  • 我正在使用power shell控制台运行以下power外壳脚本: 这将打印错误。然后继续并打印“创建的新对象”和“结束”。所以我假设这是一个非终结性错误。 但是,如果我将try catch块放在新对象周围,如下所示: 在这种情况下,捕获块被击中并写入异常消息。 我的问题是: < li >这是一个非终止错误吗?这看起来像是一个非终止性错误,因为在错误之后继续执行(当没有try catch块时)。

  • 问题内容: 我试图确保用户输入是整数,但是当我使用下面的代码时,我只会得到语句的无限循环。关于如何改进的任何建议? 问题答案: 不会消耗无效的输入,因此它将反复尝试读取相同的无效值。要解决此问题,您需要通过调用或接受任何值来显式使用它。 顺便说一句,为使您的代码更整洁并避免昂贵的操作(如创建异常),您应使用。 这是组织代码的方法