ForEach-Object
Realiza una operación en cada elemento de una colección de objetos de entrada.
Sintaxis
ScriptBlockSet (valor predeterminado)
ForEach-Object
[-Process] <ScriptBlock[]>
[-InputObject <PSObject>]
[-Begin <ScriptBlock>]
[-End <ScriptBlock>]
[-RemainingScripts <ScriptBlock[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
PropertyAndMethodSet
ForEach-Object
[-MemberName] <String>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Description
El cmdlet ForEach-Object realiza una operación en cada elemento de una colección de objetos de entrada.
Los objetos de entrada se pueden canalizar al cmdlet o especificarse mediante el parámetro InputObject
A partir de Windows PowerShell 3.0, hay dos maneras diferentes de construir un comando ForEach-Object.
bloque script. Puede usar un bloque de script para especificar la operación. Dentro del bloque de script, use la
$_variable para representar el objeto actual. El bloque de script es el valor del parámetro Process . El bloque de script puede contener cualquier script de PowerShell.Por ejemplo, el siguiente comando obtiene el valor de la propiedad ProcessName de cada proceso del equipo.
Get-Process | ForEach-Object {$_.ProcessName}instrucción Operation. También puede escribir una instrucción operation, que es mucho más similar al lenguaje natural. Puede usar la instrucción operation para especificar un valor de propiedad o llamar a un método. Las instrucciones de operación se introdujeron en Windows PowerShell 3.0.
Por ejemplo, el siguiente comando también obtiene el valor de la propiedad ProcessName de cada proceso del equipo.
Get-Process | ForEach-Object ProcessNameAl usar el formato de bloque de script, además de usar el bloque de script que describe las operaciones que se realizan en cada objeto de entrada, puede proporcionar dos bloques de script adicionales. El bloque Begin script, que es el valor del parámetro Begin, se ejecuta antes de que este cmdlet procese el primer objeto de entrada. El bloque End script, que es el valor del parámetro End, se ejecuta después de que este cmdlet procese el último objeto de entrada.
Ejemplos
Ejemplo 1: Dividir enteros en una matriz
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Este comando toma una matriz de tres enteros y divide cada uno de ellos en 1024.
Ejemplo 2: Obtener la longitud de todos los archivos de un directorio
Get-ChildItem $pshome | ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
Este comando obtiene los archivos y directorios del directorio de instalación de PowerShell $pshome y los pasa al cmdlet ForEach-Object.
Si el objeto no es un directorio, el bloque de script obtiene el nombre del archivo, divide el valor de su propiedad Length en 1024 y agrega un espacio (" ") para separarlo de la entrada siguiente.
El cmdlet usa la propiedad PSISContainer para determinar si un objeto es un directorio.
Ejemplo 3: Operar en los eventos del sistema más recientes
$Events = Get-EventLog -LogName System -Newest 1000
$events | ForEach-Object -Begin {Get-Date} -Process {Out-File -FilePath Events.txt -Append -InputObject $_.Message} -End {Get-Date}
Este comando obtiene los 1000 eventos más recientes del registro de eventos del sistema y los almacena en la variable $Events.
A continuación, canaliza los eventos al cmdlet ForEach-Object.
El parámetro Begin muestra la fecha y hora actuales.
A continuación, el parámetro Process
Ejemplo 4: Cambiar el valor de una clave del Registro
Get-ItemProperty -Path HKCU:\Network\* | ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}
Este comando cambia el valor del RemotePath entrada del Registro en todas las subclaves de la clave HKCU:\Network a texto en mayúsculas. Puede usar este formato para cambiar el formulario o el contenido de un valor de entrada del Registro.
Cada subclave de la red clave representa una unidad de red asignada que se volverá a conectar al iniciar sesión.
La entrada RemotePath contiene la ruta de acceso UNC de la unidad conectada.
Por ejemplo, si asigna la unidad E: a \\Server\Share, habrá una subclave E de HKCU:\Network y el valor de la entrada del Registro remotePath
El comando usa el cmdlet Set-ItemProperty comando , la ruta de acceso es el valor de la propiedad PSPath de la clave del Registro.
Se trata de una propiedad del objeto de Microsoft .NET Framework que representa la clave del Registro, no una entrada del Registro.
El comando usa el método ToUpper() del valor de RemotePath, que es una cadena (REG_SZ).
Dado que Set-ItemProperty cambia la propiedad de cada clave, el ForEach-Object cmdlet es necesario para acceder a la propiedad .
Ejemplo 5: Usar la variable automática $Null
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
En este ejemplo se muestra el efecto de canalización de la $Null variable automática al ForEach-Object cmdlet .
Dado que PowerShell trata null como marcador de posición explícito, el cmdlet ForEach-Object genera un valor para $Null, igual que para otros objetos que se canalizan a él.
Para obtener más información sobre la variable automática $Null, consulte about_Automatic_Variables.
Ejemplo 6: Obtener valores de propiedad
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
Estos comandos obtienen el valor de la propiedad path de
El segundo comando es equivalente al primero.
Usa el alias
El cmdlet ForEach-Object es muy útil para obtener valores de propiedad, ya que obtiene el valor sin cambiar el tipo, a diferencia de los cmdlets de Format o el cmdlet Select-Object, que cambian el tipo de valor de propiedad.
Ejemplo 7: Dividir nombres de módulo en nombres de componente
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object {$_.Split(".")}
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | ForEach-Object -MemberName Split -ArgumentList "."
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" | Foreach Split "."
Microsoft
PowerShell
Core
Microsoft
PowerShell
Host
Estos comandos dividen dos nombres de módulo separados por puntos en sus nombres de componente. Los comandos llaman al método Split de cadenas. Los tres comandos usan una sintaxis diferente, pero son equivalentes e intercambiables.
El primer comando usa la sintaxis tradicional, que incluye un bloque de script y el operador $_de objeto actual.
Usa la sintaxis de punto para especificar el método y paréntesis para incluir el argumento delimitador.
El segundo comando usa el parámetro
El tercer comando usa el alias
La salida de estos tres comandos, que se muestra a continuación, es idéntica.
split es solo uno de los muchos métodos útiles de cadenas.
Para ver todas las propiedades y métodos de las cadenas, canalice una cadena al cmdlet Get-Member.
Parámetros
-ArgumentList
Especifica una matriz de argumentos para una llamada de método.
Este parámetro se introdujo en Windows PowerShell 3.0.
Propiedades de parámetro
| Tipo: | Object[] |
| Valor predeterminado: | None |
| Admite caracteres comodín: | False |
| DontShow: | False |
| Alias: | Argumentos |
Conjuntos de parámetros
PropertyAndMethodSet
| Posición: | Named |
| Obligatorio: | False |
| Valor de la canalización: | False |
| Valor de la canalización por nombre de propiedad: | False |
| Valor de los argumentos restantes: | False |
-Begin
Especifica un bloque de script que se ejecuta antes de que este cmdlet procese los objetos de entrada.
Propiedades de parámetro
| Tipo: | ScriptBlock |
| Valor predeterminado: | None |
| Admite caracteres comodín: | False |
| DontShow: | False |
Conjuntos de parámetros
ScriptBlockSet
| Posición: | Named |
| Obligatorio: | False |
| Valor de la canalización: | False |
| Valor de la canalización por nombre de propiedad: | False |
| Valor de los argumentos restantes: | False |
-Confirm
Le pide confirmación antes de ejecutar el cmdlet.
Propiedades de parámetro
| Tipo: | SwitchParameter |
| Valor predeterminado: | False |
| Admite caracteres comodín: | False |
| DontShow: | False |
| Alias: | cf |
Conjuntos de parámetros
(All)
| Posición: | Named |
| Obligatorio: | False |
| Valor de la canalización: | False |
| Valor de la canalización por nombre de propiedad: | False |
| Valor de los argumentos restantes: | False |
-End
Especifica un bloque de script que se ejecuta después de que este cmdlet procese todos los objetos de entrada.
Propiedades de parámetro
| Tipo: | ScriptBlock |
| Valor predeterminado: | None |
| Admite caracteres comodín: | False |
| DontShow: | False |
Conjuntos de parámetros
ScriptBlockSet
| Posición: | Named |
| Obligatorio: | False |
| Valor de la canalización: | False |
| Valor de la canalización por nombre de propiedad: | False |
| Valor de los argumentos restantes: | False |
-InputObject
Especifica los objetos de entrada.
ForEach-Object ejecuta la instrucción script block o operation en cada objeto de entrada.
Escriba una variable que contenga los objetos, o escriba un comando o expresión que obtenga los objetos.
Cuando se usa el parámetro InputObject con ForEach-Object, en lugar de canalizar los resultados del comando a ForEach-Object, el valor InputObject se trata como un único objeto.
Esto es true incluso si el valor es una colección que es el resultado de un comando, como -InputObject (Get-Process).
Dado que inputObject no puede devolver propiedades individuales de una matriz o colección de objetos, se recomienda que si usa ForEach-Object para realizar operaciones en una colección de objetos para esos objetos que tienen valores específicos en propiedades definidas, se usa ForEach-Object en la canalización, como se muestra en los ejemplos de este tema.
Propiedades de parámetro
| Tipo: | PSObject |
| Valor predeterminado: | None |
| Admite caracteres comodín: | False |
| DontShow: | False |
Conjuntos de parámetros
(All)
| Posición: | Named |
| Obligatorio: | False |
| Valor de la canalización: | True |
| Valor de la canalización por nombre de propiedad: | False |
| Valor de los argumentos restantes: | False |
-MemberName
Especifica la propiedad que se va a obtener o al método que se va a llamar.
Se permiten caracteres comodín, pero solo funcionan si la cadena resultante se resuelve en un valor único.
Si, por ejemplo, ejecuta Get-Process | ForEach -MemberName *Namey hay más de un miembro con un nombre que contiene la cadena Name, como el ProcessName y propiedades Name, se produce un error en el comando.
Este parámetro se introdujo en Windows PowerShell 3.0.
Propiedades de parámetro
| Tipo: | String |
| Valor predeterminado: | None |
| Admite caracteres comodín: | True |
| DontShow: | False |
Conjuntos de parámetros
PropertyAndMethodSet
| Posición: | 0 |
| Obligatorio: | True |
| Valor de la canalización: | False |
| Valor de la canalización por nombre de propiedad: | False |
| Valor de los argumentos restantes: | False |
-Process
Especifica la operación que se realiza en cada objeto de entrada. Escriba un bloque de script que describa la operación.
Propiedades de parámetro
| Tipo: | ScriptBlock[] |
| Valor predeterminado: | None |
| Admite caracteres comodín: | False |
| DontShow: | False |
Conjuntos de parámetros
ScriptBlockSet
| Posición: | 0 |
| Obligatorio: | True |
| Valor de la canalización: | False |
| Valor de la canalización por nombre de propiedad: | False |
| Valor de los argumentos restantes: | False |
-RemainingScripts
Especifica todos los bloques de script que no toman el parámetro Process.
Este parámetro se introdujo en Windows PowerShell 3.0.
Propiedades de parámetro
| Tipo: | ScriptBlock[] |
| Valor predeterminado: | None |
| Admite caracteres comodín: | False |
| DontShow: | False |
Conjuntos de parámetros
ScriptBlockSet
| Posición: | Named |
| Obligatorio: | False |
| Valor de la canalización: | False |
| Valor de la canalización por nombre de propiedad: | False |
| Valor de los argumentos restantes: | False |
-WhatIf
Muestra lo que sucedería si el cmdlet se ejecuta. El cmdlet no se ejecuta.
Propiedades de parámetro
| Tipo: | SwitchParameter |
| Valor predeterminado: | False |
| Admite caracteres comodín: | False |
| DontShow: | False |
| Alias: | Wi |
Conjuntos de parámetros
(All)
| Posición: | Named |
| Obligatorio: | False |
| Valor de la canalización: | False |
| Valor de la canalización por nombre de propiedad: | False |
| Valor de los argumentos restantes: | False |
CommonParameters
Este cmdlet admite los parámetros comunes: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction y -WarningVariable. Para obtener más información, vea about_CommonParameters.
Entradas
PSObject
Puede canalizar cualquier objeto a este cmdlet.
Salidas
PSObject
Este cmdlet devuelve objetos determinados por la entrada.
Notas
- El cmdlet
funciona de forma similar a la instrucción foreach deForeach, salvo que no se puede canalizar la entrada a una instrucción foreach de . Para obtener más información sobre la instrucción , vea about_Foreach . - A partir de PowerShell 4.0,
WhereyForEachse agregaron métodos para su uso con colecciones. - Puede obtener más información sobre estos nuevos métodos aquí about_arrays