Compartir a través de


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 ProcessName

    Al 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 usa el cmdlet para crear un archivo de texto denominado events.txt y almacena la propiedad message de cada uno de los eventos de ese archivo. Por último, el parámetro End se usa para mostrar la fecha y hora después de que se haya completado todo el procesamiento.

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 en la subclave E será \\Server\Share.

El comando usa el cmdlet para obtener todas las subclaves de la clave de Network y el cmdlet para cambiar el valor de la entrada del Registro remotePath de en cada clave. En el 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 de todos los módulos de PowerShell instalados. Usan el parámetro MemberName para especificar la propiedad path path de los módulos.

El segundo comando es equivalente al primero. Usa el alias Foreach del cmdlet y omite el nombre del parámetro MemberName, que es opcional.

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 MemberName para especificar el método Split y el parámetro argumentName para identificar el punto (".") como delimitador dividido.

El tercer comando usa el alias Foreach del cmdlet foreach-Object y omite los nombres de los parámetros MemberName y ArgumentList, que son opcionales.

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, salvo que no se puede canalizar la entrada a una instrucción foreach de . Para obtener más información sobre la instrucción foreach de , vea about_Foreach.
  • A partir de PowerShell 4.0, Where y ForEach se agregaron métodos para su uso con colecciones.
  • Puede obtener más información sobre estos nuevos métodos aquí about_arrays