2011-08-04 9 views
7

Tengo una secuencia de comandos de PowerShell que se repite a través del sistema de archivos utilizando GetChildItem en for-loop. Mientras viaja, está solucionando problemas de ACL que encuentra (sobre todo cuando alguien ha bloqueado la cuenta BUILTIN \ Administrators) ... pero hay algunos que no puede manejar por sí mismo, como cuando obtengo [System.UnauthorizedAccessException] si hay es un ACE explícito de "Denegar".¿Pueden los errores de captura de PowerShell en GetChildItem y continuar el bucle?

La línea de código es el siguiente:

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

Cuando se tropieza en un camino que no puede leer, da a esta excepción:

Get-ChildItem: acceso a la ruta 'C: \ TEMP \ denied' es denegado. En Fix-ACLs.ps1: 52 Char: 31 + ($ archivo en Get-ChildItem < < < < $ dirroot -Recurse -ErrorAction Continuar) foreach {+ CategoryInfo: PermissionDenied: (C: \ TEMP \ negado : String) [Get-ChildItem], AccessException no autorizado + FullyQualifiedErrorId: DirUnauthorizedAccessError, Microsoft.PowerShell.Commands.GetChildItemCommand

me gustaría probar/captura o captura el error para que pueda reparar el ligamento cruzado anterior (es decir, eliminar el "Denegar") en el lugar y, lo más importante, continuar el ciclo sin perder mi plac mi. Alguna sugerencia para mi?

+0

Dale algo de código que está utilizando – manojlds

Respuesta

8

has utilizado silentlycontinue?

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

De hecho tengo ... pero todavía se ejecuta a través del bloque de código con un montón más errores. Dado que 'trap' y' try/catch' generalmente funcionan en los errores "Stop", la mejor opción que he encontrado hasta ahora es usar '-ErrorAction SilentlyContinue' como sugirió, y luego en la primera línea del código Verifique si obtuvimos un error con 'if ($ error) {...'. – ewall

5

¿Qué le parece?

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

Tal vez abrir una segunda ventana PS para solucionar el error y luego continuar el comando en la primera ventana PS seleccionando Y para continuar.

También puede utilizar -ErrorVariable

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

un Get-Variable o $ A podrá mostrar todos los errores cometidos por el comando. También puede usar + nombre de variable (+ a) para agregar errores a una variable existente.

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

Buena idea, @Jesse. ¡Gracias! – ewall

Cuestiones relacionadas