Como otros lenguajes de programación, PowerShell tiene el concepto de bucles. Anteriormente, ya cubrimos cómo crear un script de PowerShell para recorrer archivos y carpetas. El bucle (ciclo) le permite ejecutar varias veces un determinado conjunto de comandos.
El Para cada bucle le permite iterar sobre los valores de la matriz. Su tarea es realizar determinadas acciones para todos los elementos de la matriz. A diferencia del regular por, se utiliza para iterar sobre objetos en una matriz.
Insinuación. Te recordamos que PowerShell es un lenguaje de programación orientado a objetos.
El bucle ForEach tiene la siguiente sintaxis:
ForEach ($item in $array){ Scriptblock }
La variable $ item dentro del bucle apunta al elemento actual de la matriz $.
Por ejemplo, cree una matriz simple y use el bucle foreach para enumerar todos sus valores:
$PCs = "PCName1", "PCName2", "PCName3" foreach ($PC in $PCs) { write-host $PC }
En algunos lenguajes de programación, el procesamiento para procesar dicha matriz debe realizar 2 pasos. Primero, debe obtener la longitud de la matriz y luego realizar una acción para cada elemento. En PowerShell, todo es más sencillo. No es necesario calcular el número de elementos de la matriz. Simplemente pasa secuencialmente por todos los elementos.
Ahora intente obtener una lista de archivos en un directorio específico. Ahora, usando el bucle ForEach, muestre los nombres de los archivos y la fecha de creación de cada archivo:
$Files = (Get-ChildItem "C:PS*") foreach ($File in $Files) { write-host $File.name $File.CreationTime }
Como puede ver, dentro del bucle ForEach puede acceder a todas las propiedades y métodos de cada objeto en la matriz.
Consideremos otro ejemplo del uso de un bucle For-Each en AD. Por ejemplo, debe copiar un archivo específico a todas las computadoras en Denver (se asume que todas las computadoras se unieron al dominio de Active Directory y se ubicaron en la misma unidad organizativa):
# Get a list of active AD computers in OU Denver $ADComps = Get-ADComputer -Filter {enabled -eq "true"} # Now, using the ForEach loop, copy the file from the network shared folder to the root directory (C: drive) of each computer $SourceFile= “denv-fs01docdistrmy.cfg” foreach ($computer in $ADComps) { $Hostname = $Computer.Name $TargetPath = "$HostnameC$" Copy-Item $SourceFile $TargetPath -Force }
Tenga en cuenta que hay un Para cada objeto cmdlet (con el alias Para cada), y un Para cada círculo. Esto puede resultar engañoso. El comando ForEach-Object se usa con mayor frecuencia en canalizaciones. El bucle ForEach no se puede utilizar en la canalización.
Por ejemplo, el comando ForEach-Object:
Get-Service | ForEach-Object {$PSitem.Name}
O, usando un alias:
Get-Service | ForEach {$PSitem.Name}
Y ahora el bucle ForEach:
$services= Get-Service ForEach ($service in $services) { write-host $service.displayname }
PowerShell entiende por una sintaxis de construcción general cuándo usar el cmdlet ForEach y cuándo usar un bucle.
Una de las diferencias entre el bucle foreach y un cmdlet foreach es la capacidad de usar Seguir y descanso operadores.
La instrucción continue le permite omitir la ejecución de la parte restante de a e ir inmediatamente al siguiente elemento de la matriz.
El descanso declaración detiene por completo la enumeración de elementos en un bucle. Se usa, estamos buscando un valor específico y debe salir del bucle cuando lo encuentre:
$num=0 $computers="PC1",'PC2','Server1','PC3' foreach ($computer in $computers) { if ($computer -like '*Server*') { break } $num++ } $num
En este ejemplo, el bucle se detuvo en terceros elementos.
Hay tres variables especiales disponibles en el ciclo ForEach:
- $ foreach.MoveNext () - ir al siguiente elemento;
- $ foreach.current - puntero del elemento actual;
- $ foreach.reset (): restablece la iteración. La iteración comenzará de nuevo, lo que conducirá a un ciclo sin fin.
Los bucles de PowerShell ForEach tienen un alcance muy amplio. Esto ayuda en la administración del servidor, la gestión de servicios, procesos y archivos, operaciones con objetos de Active Directory, etc.