Может ли PowerShell перехватывать ошибки в GetChildItem и продолжать цикл? - PullRequest
7 голосов
/ 04 августа 2011

У меня есть сценарий PowerShell, который выполняется через файловую систему с использованием GetChildItem в цикле for. Когда он путешествует, он исправляет обнаруженные проблемы ACL (в основном, когда кто-то заблокировал учетную запись BUILTIN \ Administrators) ... но есть некоторые, которые он не может обработать самостоятельно, например, когда я получаю [System.UnauthorizedAccessException], если есть является явным "Запретить" ACE.

Строка кода выглядит следующим образом:

foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorAction Continue) {
    ...
}

Когда он натыкается на путь, который не может прочитать, он выдает следующее исключение:

Get-ChildItem: доступ к пути «C: \ TEMP \ denied» запрещен. В Fix-ACLs.ps1: 52 символа: 31 + foreach ($ file в Get-ChildItem <<<< $ dirRoot -Recurse -ErrorAction Продолжить) { + CategoryInfo: PermissionDenied: (C: \ TEMP \ denied: String) [Get-ChildItem], исключение неавторизованного доступа + FullyQualifiedErrorId: DirUnauthorizedAccessError, Microsoft.PowerShell.Commands.GetChildItemCommand </p>

Я хотел бы попытаться / поймать или перехватить ошибку, чтобы я мог восстановить ACL (то есть удалить «Запретить») на месте и, что самое важное, продолжить цикл, не теряя своего места. Любые предложения для меня?

Ответы [ 2 ]

8 голосов
/ 04 августа 2011

Вы использовали тихо, продолжайте?

foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorAction silentlycontinue) {
    ...
}
5 голосов
/ 16 февраля 2013

Как насчет Inquire?

foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorAction Inquire) {
...
}

Возможно, откройте второе окно PS, чтобы устранить ошибку, затем продолжите команду в первом окне PS, выбрав Y для продолжения.

Вы можететакже используйте ErrorVariable

foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorVariable a) {
...
}

Get-Variable a или $ a покажет вам все ошибки, возникшие в команде.Вы также можете использовать + variablename (+ a) для добавления ошибок в существующую переменную.

foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorVariable +a) {
...
}
...