【问题标题】:PowerShell: Catch errors but continue without loop?PowerShell:捕获错误但没有循环继续?
【发布时间】:2019-12-02 21:06:16
【问题描述】:

我喜欢认为我很擅长使用 PowerShell,但在这里我有点难过。

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

Get-ChildItem $path -Recurse

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

通常您使用 Try/Catch 将错误消息存储在循环之外的某个循环中,这非常有效。但我实际上没有循环继续。我不知道现在该怎么办。这是我的源代码。

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 块中不可避免地发生的错误,但我实际上没有循环。我真的不知道如何将其设置为循环以使事情变得更好。

如果我运行这段代码,它会写出“我开始了!”之后几乎立即“我开始了 Try 语句”。然后它将工作大约一分钟。然后我得到一个“我开始了 Catch 声明!”它立即结束。为什么会发生这种情况是有道理的,但这显然不是预期的结果。

我只是想错了吗?

【问题讨论】:

    标签: powershell try-catch


    【解决方案1】:

    您描述的错误是非终止错误,您可以在其中收集 带有common -ErrorVariable parameter 的变量,不会在第一个错误时停止命令(这是-ErrorAction Stop 所做的)。

    # Silence non-terminating errors and collect them in variable $errs
    Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs
    
    • 注意如何指定目标变量名称errs没有$,因为您传递的是变量的名称,而不是它的值。 $errs 被创建为 本地 变量。

      • 通常最好避免跨范围边界设置变量,但可以脚本范围/全局范围内定位变量相反,即与
        -ErrorVariable script:errs / -ErrorVariable global:errs
    • 为了也静默错误,使用-ErrorAction SilentlyContinue,而不是-ErrorAction Ignore——后者会完全抑制错误,使$errs为空。

    【讨论】:

    • 我试过这个确切的代码,但我的错误变量仍然为空。我知道虽然有错误。它与成为全局变量有关吗? -ErrorVariable 是否创建局部变量?
    • @lordsampigans:是的,-ErrorVariable 默认创建一个 local 变量,但如果需要,您可以使用范围修饰符 - 请参阅我的更新。
    猜你喜欢
    • 2011-10-20
    • 2020-07-01
    • 1970-01-01
    • 2020-08-15
    • 2012-11-13
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多