PowerShell para cada objeto [con ejemplos]
Hoy voy a explicar un concepto muy útil en PowerShell: el cmdlet ForEach-Object. Este es el cmdlet más utilizado en PowerShell. Le mostraré ejemplos detallados de PowerShell ForEach-Object.
El cmdlet ForEach-Object en PowerShell procesa cada elemento de una colección individualmente, lo que permite operaciones como modificar propiedades o ejecutar comandos. Por ejemplo, para duplicar cada número en una secuencia, puedes usar 1..5 | ForEach-Object { $_ * 2 }, que genera 2, 4, 6, 8 y 10.
Para cada objeto en PowerShell
El cmdlet ForEach-Object de PowerShell opera en cada elemento de una colección de objetos de entrada. Este cmdlet es particularmente útil cuando necesita procesar cada elemento individualmente en una canalización. A diferencia de la palabra clave ForEach , que se utiliza en un bloque de script, ForEach-Object es un cmdlet que se puede utilizar directamente en la canalización.
Sintaxis de PowerShell para cada objeto
La sintaxis de ForEach-Object en PowerShell es así:
ForEach-Object [-InputObject] <psobject> [-Begin <scriptblock>] [-Process <scriptblock>] [-End <scriptblock>] [<CommonParameters>]-InputObject: especifica los objetos que se procesarán. Este parámetro es opcional porqueForEach-Objectnormalmente recibe información de la canalización.-Begin: define un bloque de script que se ejecuta antes del bloque de scriptProcess.-Process: define el bloque de script que se ejecuta una vez para cada objeto de entrada.-End: define un bloque de script que se ejecuta después de que el bloque de scriptProcessha procesado todos los objetos de entrada.
Lea ¿Cómo utilizar comodines en PowerShell Switch?
Ejemplos de PowerShell para cada objeto
Ahora, déjame mostrarte algunos ejemplos de cómo usar el objeto foreach en PowerShell.
Ejemplo 1: básico para cada objeto
Supongamos que tenemos una lista de números y queremos imprimir cada número. Aquí está el script con el objeto foreach.
1..5 | ForEach-Object { $_ }En este ejemplo, 1..5 genera una secuencia de números del 1 al 5 y ForEach-Object procesa cada número de la secuencia. La variable $_ representa el objeto actual en la canalización.
Ejecuto el script de PowerShell anterior usando código VS y puedes ver el resultado en la siguiente captura de pantalla:
Ejemplo 2: realizar cálculos
Puede utilizar ForEach-Object para realizar varias operaciones en cada objeto de la canalización. Por ejemplo, digamos que queremos duplicar cada número de la lista; entonces, puedes escribir el siguiente script.
1..5 | ForEach-Object { $_ * 2 }Este script generará:
2
4
6
8
10Ejemplo 3: cambiar el nombre de archivos en un directorio usando foreach-object
Suponga que tiene un directorio con archivos cuyo nombre debe cambiarse para incluir una marca de tiempo. Puedes usar ForEach-Object para obtener esto, como se muestra a continuación:
Get-ChildItem -Path "C:\MyFolder" -File | ForEach-Object {
$newName = "{0}_{1}{2}" -f $_.BaseName, (Get-Date -Format "yyyyMMdd"), $_.Extension
Rename-Item -Path $_.FullName -NewName $newName
}Puede ver la captura de pantalla a continuación, cambia el nombre de todos los archivos en la carpeta después de ejecutar el script de PowerShell anterior.
Ejemplo 4: Modificar claves de registro usando foreach-object
Déjame mostrarte otro pequeño ejemplo complejo de un objeto para cada uno.
Suponga que necesita actualizar una clave de registro específica para una lista de computadoras. Puede utilizar ForEach-Object para realizar esta tarea.
$computers = @("Computer1", "Computer2", "Computer3")
$computers | ForEach-Object {
Invoke-Command -ComputerName $_ -ScriptBlock {
Set-ItemProperty -Path "HKLM:\Software\MyApp" -Name "Setting" -Value "NewValue"
}
}Este script actualiza la clave de registro en cada computadora de la lista.
PowerShell para cada objeto con bloques de script de inicio, proceso y finalización
El cmdlet ForEach-Object en PowerShell le permite definir tres bloques de script: Begin, Process y End. Estos bloques de script pueden realizar tareas de inicialización, procesamiento y limpieza.
Aquí hay un ejemplo:
Supongamos que queremos calcular la suma de una lista de números usando PowerShell. Podemos utilizar los bloques de script Begin, Process y End para lograr esto:
$sum = 0
1..5 | ForEach-Object -Begin { $sum = 0 } -Process { $sum += $_ } -End { $sum }En este ejemplo:
- El bloque
Begininicializa la variable$sumen 0. - El bloque
Procesoañade cada número a la variable$sum. - El bloque
Endgenera la suma final.
La salida será:
15Leer PowerShell para cada bucle
Filtrar objetos con Where-Object en PowerShell para cada objeto
A continuación se muestra un interesante ejemplo de filtrado de objetos con Where-Object en PowerShell para cada objeto.
Puede utilizar el cmdlet Where-Object con ForEach-Object para lograr esto.
Filtremos solo los números pares de una lista y luego duplíquelos:
1..10 | Where-Object { $_ % 2 -eq 0 } | ForEach-Object { $_ * 2 }El cmdlet Where-Object filtra los números y ForEach-Object procesa los números filtrados. La salida será:
4
8
12
16
20También puede ver el resultado en la captura de pantalla a continuación después de ejecutar el script anterior usando el código VS.
PowerShell para cada objeto con matrices y colecciones
ForEach-Object es particularmente útil cuando se trabaja con matrices y colecciones de PowerShell. Consideremos un ejemplo en el que tenemos una matriz de cadenas que representan nombres de archivos y queremos agregar un sufijo a cada nombre de archivo.
$files = @("file1.txt", "file2.txt", "file3.txt")
$files | ForEach-Object { "$_ - backup" }Este script generará:
file1.txt - backup
file2.txt - backup
file3.txt - backupAnidado para cada objeto en PowerShell
Puede anidar cmdlets ForEach-Object para realizar operaciones más complejas. Por ejemplo, digamos que tenemos una lista de directorios y queremos enumerar todos los archivos en cada directorio.
A continuación se muestra un ejemplo de un ejemplo de objeto anidado para cada objeto.
$directories = @("C:\Folder1", "C:\Folder2")
$directories | ForEach-Object {
Get-ChildItem $_ | ForEach-Object {
$_.FullName
}
}Este script enumerará las rutas completas de todos los archivos en los directorios especificados.
Manejo de errores con PowerShell para cada objeto
Ahora, déjame mostrarte cómo manejar errores con PowerShell para cada objeto con un ejemplo.
Supongamos que tenemos una lista de rutas de archivos y queremos leer el contenido de cada archivo. Podemos manejar errores potenciales usando los bloques Try y Catch :
$files = @("C:\file1.txt", "C:\file2.txt", "C:\nonexistent.txt")
$files | ForEach-Object {
Try {
Get-Content $_
} Catch {
Write-Host "Error reading file: $_"
}
}En este ejemplo, se detectará el error si un archivo no existe y se mostrará un mensaje en lugar de finalizar el script.
Leer PowerShell para bucle
PowerShell para cada objeto continuar
Comprendamos en detalle cómo usar la declaración de continuación foreach-object de PowerShell con un ejemplo.
En PowerShell, la instrucción continue dentro de un cmdlet ForEach-Object se utiliza para omitir la iteración actual y pasar al siguiente elemento del proceso. Esto es útil cuando se omiten ciertos elementos según una condición sin terminar todo el bucle.
Supongamos que tiene una lista de números y desea procesar solo los números impares, omitiendo los pares. Puede utilizar la instrucción continue dentro de ForEach-Object como se muestra a continuación:
1..10 | ForEach-Object {
if ($_ % 2 -eq 0) {
continue
}
Write-Output $_
}En este ejemplo:
1..10genera una secuencia de números del 1 al 10.ForEach-Objectprocesa cada número de la secuencia.- La instrucción
ifcomprueba si el número actual ($_) es par ($_ % 2 -eq 0). - Si el número es par, la instrucción
continuese salta el resto del bloque de secuencia de comandos y pasa al siguiente número. - Si el número es impar, se imprime usando
Write-Output.
La salida será:
1
3
5
7
9Ruptura de PowerShell para cada objeto
También puede utilizar la declaración break en PowerShell para cada objeto. Déjame mostrarte un ejemplo.
En PowerShell, la instrucción break dentro de un cmdlet ForEach-Object se utiliza para salir del bucle por completo, deteniendo el procesamiento posterior de los elementos en el proceso. Esto puede resultar útil para finalizar el bucle antes de tiempo en función de una condición específica.
Supongamos que tiene una lista de números y desea procesarlos hasta encontrar el número 5, momento en el que desea dejar de procesar.
1..10 | ForEach-Object {
if ($_ -eq 5) {
break
}
Write-Output $_
}En este ejemplo:
1..10genera una secuencia de números del 1 al 10.ForEach-Objectprocesa cada número de la secuencia.- La instrucción
ifcomprueba si el número actual ($_) es igual a 5. - Si el número es 5, la instrucción
breaksale del bucle y detiene cualquier procesamiento posterior. - Si el número no es 5, se imprime usando
Write-Output.
La salida será:
1
2
3
4El bucle sale cuando se encuentra el número 5 y no se procesan ni imprimen más números. Esto explica cómo se puede utilizar la instrucción break dentro de ForEach-Object para controlar el flujo de procesamiento y finalizar el ciclo según condiciones específicas.
Ejecuté el script de PowerShell anterior y puedes ver el resultado en la siguiente captura de pantalla:
Conclusión
Espero que ahora sepas cómo usar el objeto foreach en PowerShell con los ejemplos anteriores. Con eso, también he explicado lo siguiente:
- PowerShell para cada objeto con bloques de script de inicio, proceso y finalización
- Filtrar objetos con Where-Object en PowerShell para cada objeto
- PowerShell para cada objeto con matrices y colecciones
- Anidado para cada objeto en PowerShell
- Manejo de errores con PowerShell para cada objeto
- PowerShell para cada objeto continuar
- Ruptura de PowerShell para cada objeto



