PowerShell:捕获错误但不循环继续?

PowerShell:捕获错误但不循环继续?,powershell,try-catch,Powershell,Try Catch,我喜欢认为我对PowerShell很在行,但我在这里有点不知所措 我有一个巨大的文件列表,我将在上面运行此代码,这将给我一些必要的文件信息,我将运行分析。第一步就是获取文件列表。所以我运行这个 Get-ChildItem $path -Recurse 这返回了一堆无用的信息,但也给了我一片红色的海洋。有大量的文件和文件夹无法找到,并明确拒绝我。我想捕获所有这些错误,以便将它们解析为相关信息,因此我的直觉告诉我使用Try/catch 通常,您使用Try/Catch将错误消息存储在循环之外的某个循

我喜欢认为我对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语句”。然后它会工作大约一分钟。然后我得到一个“我开始了捕获声明!”并且它立即结束。这是有道理的,但这显然不是预期的结果


我只是想错了吗?

您描述的错误是非终止错误,您可以在 带有的变量,在第一个错误时不停止命令(这是
-ErrorAction Stop
所做的)

  • 请注意,由于传递的是变量名,而不是其值,因此必须在不使用
    $
    的情况下指定目标变量名
    errs
    $errs
    被创建为局部变量

    • 通常最好避免设置跨越范围边界的变量,但也可以将变量作为脚本范围/全局范围的目标,即使用
      -ErrorVariable脚本:errs
      /
      -ErrorVariable全局:errs
  • 要使错误静音,请使用
    -ErrorAction SilentlyContinue
    ,而不是
    -ErrorAction Ignore
    ——后者将完全抑制错误,使
    $errs
    为空


您描述的错误是非终止错误,您可以在 带有的变量,在第一个错误时不停止命令(这是
-ErrorAction Stop
所做的)

  • 请注意,由于传递的是变量名,而不是其值,因此必须在不使用
    $
    的情况下指定目标变量名
    errs
    $errs
    被创建为局部变量

    • 通常最好避免设置跨越范围边界的变量,但也可以将变量作为脚本范围/全局范围的目标,即使用
      -ErrorVariable脚本:errs
      /
      -ErrorVariable全局:errs
  • 要使错误静音,请使用
    -ErrorAction SilentlyContinue
    ,而不是
    -ErrorAction Ignore
    ——后者将完全抑制错误,使
    $errs
    为空


我尝试了这个精确的代码,但我的错误变量仍然为空。不过我知道有些错误。它是否与作为一个全局变量有关?-ErrorVariable是否创建局部变量?@lordsampigans:是的,
-ErrorVariable
默认创建局部变量,但如果需要,您可以使用范围修饰符-请查看我的更新。我尝试了这段代码,但我的错误变量仍然为空。不过我知道有些错误。它是否与作为一个全局变量有关?-ErrorVariable是否创建局部变量?@lordsampigans:是的,
-ErrorVariable
默认创建局部变量,但如果需要,您可以使用范围修饰符-请参阅我的更新。
# Silence non-terminating errors and collect them in variable $errs
Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs