Поймать ошибки `Get-ChildItem` для каждого файла отдельно - PullRequest
0 голосов
/ 30 октября 2019

Я использую 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, мне пришлось бы где-то поставить попытку. Это должно быть вокруг всего трубопровода, верно? В этом случае дочерние элементы, которые были бы обнаружены после недоступного, не будут найдены и выписаны. Так что еще я могу сделать?

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Вы можете использовать общий параметр -ErrorVariable, чтобы сохранить ошибки в переменной.

Get-ChildItem -recurse foo -ErrorVariable err
$err
1 голос
/ 31 октября 2019

Для 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...