我正在使用Get-ChildItem -Recurse搜索目录。我不能保证Get-ChildItem命中的所有内容都可以访问。我要记录这些失败,但不要使整个Get-ChildItem -Recurse命令失败。现在我有

Get-ChildItem -Recurse $targetdir -ErrorAction Inquire `
        | where { $_.Name -eq $name } `
        | foreach {
            echo-indented "Found $(hash $_) at $($_.FullName)"
            $_
        }

有问题的代码是-ErrorAction Inquire。如果我做了-ErrorAction Stop,我将不得不在某个地方放一个try-catch。它必须围绕整个管道,对吗?在这种情况下,无法找到的子项将不会被找到并被写出。那我还能做什么?

最佳答案

对于Get-ChildItem -Recurse,在这里指定-ErrorAction并不会真正帮助您。只会导致拒绝访问错误为:

  • 终止(-ErrorAction Stop),一切都将停止。 (不是您想要的)
  • 您想要的是非终止(默认-ErrorAction Continue),因为它将继续。

  • 对于日志,使用默认的-ErrorAction Continue,所有访问拒绝都记录到$Error变量中。然后,我们可以解析异常记录以获得所需的信息:
    #Start by clearing the error variable
    $Error.Clear()
    
    #Execute Get-ChildItem with -ErrorAction Continue
    
    ls -Recurse $targetdir -ErrorAction Continue `
        | where { $_.Name -EQ $name } `
        | foreach {
            echo-indented "Found $(hash $_) at $($_.FullName)"
            $_
        }
    
    #Display objects we got Access Denies on:
    $Error | ForEach-Object {
        Write-Host $_.TargetObject
    }
    

    10-01 02:08