2011-08-04 8 views
7

Mam skrypt PowerShell, który jest recursing down przez system plików przy użyciu GetChildItem w pętli for. W trakcie podróży naprawia wykryte problemy ACL (głównie tam, gdzie ktoś zablokował konto BUILTIN \ Administrators) ... ale niektóre z nich nie radzą sobie samodzielnie, np. Kiedy dostaję [System.UnauthorizedAccessException], jeśli istnieje jest wyraźną "odmową" ACE.Czy PowerShell może przechwytywać błędy w GetChildItem i kontynuować tworzenie pętli?

Linia kodu wygląda następująco:

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

Gdy natrafia na ścieżce nie można odczytać, to daje ten wyjątek:

Get-ChildItem: Wstęp na ścieżce Odmówiono "C: \ TEMP \ denied". Na Fix-ACLs.ps1: 52 char: 31 + foreach ($ plik w Get-ChildItem < < < < $ dirRoot -recurse -ErrorAction dalej) { + CategoryInfo: PermissionDenied: (C: \ temp \ odmawia : String) [Get-ChildItem] Nieuprawnione AccessException + FullyQualifiedErrorId: DirUnauthorizedAccessError, Microsoft.PowerShell.Commands.GetChildItemCommand

chciałbym try/catch lub wyłapania błędów tak, że mogę naprawić ACL (to znaczy, usuń "Deny") w miejscu i - co najważniejsze - kontynuuj pętlę bez utraty mojego miejsca mi. Jakieś sugestie dla mnie?

+0

Daj jakiś kod, którego używasz – manojlds

Odpowiedz

8

czy użyłeś silentlycontinue?

foreach($file in Get-ChildItem $dirRoot -Recurse -ErrorAction silentlycontinue) { 
    ... 
} 
+0

Rzeczywiście mam ... ale to wciąż biegnie przez blok kodu z wieloma więcej błędów. Ponieważ 'pułapka' i' try/catch' zwykle działają na błędach "Stop", najlepszą opcją, którą znalazłem do tej pory, jest użycie '-ErrorAction SilentlyContinue' zgodnie z sugestią, a następnie w pierwszym wierszu kodu sprawdź, czy mamy błąd o nazwie "if ($ error) {...". – ewall

5

Co powiesz na pytanie?

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

Może otworzyć drugie okno PS, aby rozwiązać problem, a następnie kontynuować polecenie w pierwszym oknie PS, wybierając Y, aby kontynuować.

Można również użyć ErrorVariable

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

Get-zmienną lub $ a pokaże wszystkie błędy poniesionych przez komendę. Możesz także użyć + variablename (+ a), aby dodać błędy do istniejącej zmiennej.

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

Dobry pomysł, @Jesse. Dzięki! – ewall