2011-12-07 16 views
21

Tengo una secuencia de comandos de PowerShell que realiza algunas comprobaciones en todos los administradores de dominio en una serie de dominios. Para cada cuenta de usuario se realizan una serie de comprobaciones. Cuando uno de ellos falla, el script debe ir al siguiente administrador de la lista.Ir al artículo siguiente en ForEach-Object

actualmente tienen algo como esto (simplificado):

Get-QADGroupMember "Domain Admins" | Select-Object SamAccountName | ForEach-Object { 

    #Do something 
    if(!ThisCheckIsOK) 
    { 
     break; 
    } 

    #Do something else 
    if(ThisCheckIsNotOK) 
    { 
     break; 
    } 

    ... 
} 

Esto detiene todo el guión. ¿Hay alguna manera de ir al siguiente elemento?

$foreach.movenext() no funciona desde $foreach es null.

+0

Tal vez pueda obtener mejores respuestas en SO? – Smudge

+0

Si hubiera sido un foreach en C++, entonces sí. Ahora estoy usando un cmdlet Powershell y es claramente algo de administrador de sistemas. –

+0

Creo que se encuentra en algún punto intermedio, pero su pregunta es Powershell genéricamente (Cómo avanzar al siguiente elemento en un bucle de Powershell), aunque los detalles están relacionados con sys-admin. Solo teniendo en cuenta que hay ~ 500 preguntas de Powershell en SF, y casi 4k en SO tal vez haya algunas personas más calificadas para responder la pregunta de allí. Esa es mi opinión de todos modos =) – Smudge

Respuesta

26

Es posible que desee utilizar la instrucción Continue para continuar con el ciclo más interno.

Extracto de PowerShell archivo de ayuda:

En un script, el continue instrucción provoca el flujo del programa para pasar de inmediato a la parte superior del bucle más interno controlado por cualquiera de estas declaraciones:

  • for
  • foreach
  • while
+2

Foreach-object no es foreach (y tampoco una declaración), así que esto funciona mal. – Steed

+6

Esto sale de todo el enunciado 'ForEach-Object' para mí. 'Return' funciona (es decir, va al siguiente objeto). – aucuparia

+0

$ foreach.MoveNext() se puede utilizar en lugar de continue – Djarid

21

Simplemente tiene que reemplazar el break con una declaración return.

Piense en el código dentro de Foreach-Object como una función anónima. Si tiene bucles dentro de la función, simplemente use las palabras clave de control que se aplican a la construcción (continue, break, ...).

+0

Gracias! ¡Funciona! –

+1

que funcionará para esta ocasión específica pero puede no funcionar bien en scripts más grandes con bucles anidados. –

+2

Solo piense en el código dentro del foreach-object como una función anónima. Si tiene bucles dentro de la función, simplemente use las palabras clave de control que se aplican a la construcción (continuar, romper, ...) –

Cuestiones relacionadas