Compartir a través de


about_Redirection

Descripción breve

Explica cómo redirigir la salida de PowerShell a archivos de texto.

Descripción larga

De forma predeterminada, PowerShell envía la salida al host de PowerShell. Normalmente, se trata de la aplicación de consola. Sin embargo, puede redirigir la salida a un archivo de texto y puede redirigir la salida de error al flujo de salida normal.

Puede usar los métodos siguientes para redirigir la salida:

  • Use el cmdlet , que envía la Out-File salida del comando a un archivo de texto. Normalmente, se usa el Out-File cmdlet cuando es necesario usar sus parámetros, como los Encodingparámetros , Force, Widtho NoClobber .

  • Use el Tee-Object cmdlet , que envía la salida del comando a un archivo de texto y, a continuación, lo envía a la canalización.

  • Use los operadores de redireccionamiento de PowerShell. El uso del operador de redireccionamiento con un destino de archivo es funcionalmente equivalente a canalizar a Out-File sin parámetros adicionales.

Para obtener más información sobre los flujos, consulte about_Output_Streams.

Flujos de salida redirigibles

PowerShell admite el redireccionamiento de los siguientes flujos de salida.

Stream # Descripción Introducida en Write (cmdlet)
1 Correcto Stream PowerShell 2.0 Write-Output
2 Error Stream PowerShell 2.0 Write-Error
3 Stream de advertencia PowerShell 3.0 Write-Warning
4 Stream detallado PowerShell 3.0 Write-Verbose
5 Depurar Stream PowerShell 3.0 Write-Debug
6 Información Stream PowerShell 5.0 Write-Information, Write-Host
* Todas las secuencias PowerShell 3.0

También hay un flujo de progreso en PowerShell, pero no admite el redireccionamiento.

Importante

Las secuencias success y Error son similares a las secuencias stdout y stderr de otros shells. Sin embargo, stdin no está conectado a la canalización de PowerShell para la entrada.

Operadores de redireccionamiento de PowerShell

Los operadores de redirección de PowerShell son los siguientes, donde n representa el número de secuencia. El flujo correcto ( 1 ) es el valor predeterminado si no se especifica ninguna secuencia.

Operador Descripción Sintaxis
> Envíe una secuencia especificada a un archivo. n>
>> Anexe la secuencia especificada a un archivo. n>>
>&1 Redirige la secuencia especificada a la secuencia Success . n>&1

Nota

A diferencia de algunos shells de Unix, solo puede redirigir otros flujos a la secuencia Success .

Ejemplos

Ejemplo 1: Redireccionamiento de errores y salida a un archivo

Este ejemplo se ejecuta en un elemento que se ejecuta dir correctamente y otro que produce un error.

dir C:\, fakepath 2>&1 > .\dir.log

Usa 2>&1 para redirigir el flujo de error a la secuencia Success y > para enviar el flujo correcto resultante a un archivo denominado dir.log

Ejemplo 2: Enviar todos los datos de flujo correctos a un archivo

En este ejemplo se envían todos los datos de flujo correctos a un archivo denominado script.log.

.\script.ps1 > script.log

Ejemplo 3: Envío de flujos correctos, advertencias y errores a un archivo

En este ejemplo se muestra cómo puede combinar operadores de redirección para lograr un resultado deseado.

&{
   Write-Warning "hello"
   Write-Error "hello"
   Write-Output "hi"
} 3>&1 2>&1 > C:\Temp\redirection.log
  • 3>&1 redirige el flujo de advertencia a la secuencia Correcto .
  • 2>&1 redirige el flujo de error al flujo correcto (que ahora también incluye todos los datos del flujo de advertencia ).
  • > redirige la secuencia Success (que ahora contiene flujos de advertencia y error ) a un archivo denominado C:\temp\redirection.log.

Ejemplo 4: Redirigir todas las secuencias a un archivo

En este ejemplo se envían todos los flujos de salida de un script llamado script.ps1 a un archivo denominado script.log.

.\script.ps1 *> script.log

Ejemplo 5: Suprimir todos los datos de flujo de información y Write-Host

En este ejemplo se suprimen todos los datos de flujo de información. Para obtener más información sobre los cmdlets de flujo de información, consulte Write-Host y Write-Information.

&{
   Write-Host "Hello"
   Write-Information "Hello" -InformationAction Continue
} 6> $null

Ejemplo 6: Mostrar el efecto de las preferencias de acción

Las variables y los parámetros de preferencias de acción pueden cambiar lo que se escribe en una secuencia determinada. El script de este ejemplo muestra cómo afecta el valor de $ErrorActionPreference afecta a lo que se escribe en la secuencia de errores .

$ErrorActionPreference = 'Continue'
$ErrorActionPreference > log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'SilentlyContinue'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Stop'
$ErrorActionPreference >> log.txt
Try {
    get-item /not-here 2>&1 >> log.txt
}
catch {
    "`tError caught!" >> log.txt
}
$ErrorActionPreference = 'Ignore'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Inquire'
$ErrorActionPreference >> log.txt
get-item /not-here 2>&1 >> log.txt

$ErrorActionPreference = 'Continue'

Cuando se ejecuta este script, se le solicita cuando $ErrorActionPreference se establece Inquireen .

PS C:\temp> .\test.ps1

Confirm
Can't find path 'C:\not-here' because it doesn't exist.
[Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help (default is "Y"): H
Get-Item: C:\temp\test.ps1:23
Line |
  23 |  get-item /not-here 2>&1 >> log.txt
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | The running command stopped because the user selected the Stop option.

Cuando examinamos el archivo de registro, vemos lo siguiente:

PS C:\temp> Get-Content .\log.txt
Continue

Get-Item: C:\temp\test.ps1:3
Line |
   3 |  get-item /not-here 2>&1 >> log.txt
     |  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Cannot find path 'C:\not-here' because it does not exist.

SilentlyContinue
Stop
    Error caught!
Ignore
Inquire

Notas

Los operadores de redireccionamiento que no anexan datos (> y n>) sobrescriben el contenido actual del archivo especificado sin advertencia.

Sin embargo, si el archivo es un archivo de solo lectura, oculto o del sistema, se produce un error en el redireccionamiento. Los operadores de redirección de anexión (>> y n>>) no escriben en un archivo de solo lectura, pero anexan contenido a un sistema o archivo oculto.

Para forzar la redirección del contenido a un archivo de sistema, oculto o de solo lectura, use el Out-File cmdlet con su Force parámetro .

Al escribir en archivos, los operadores de redireccionamiento usan UTF8NoBOM la codificación. Si el archivo tiene una codificación diferente, es posible que la salida no tenga el formato correcto. Para escribir en archivos con una codificación diferente, use el Out-File cmdlet con su Encoding parámetro .

Ancho de salida al escribir en un archivo

Al escribir en un archivo mediante Out-File o los operadores de redireccionamiento, PowerShell da formato a la salida de la tabla al archivo en función del ancho de la consola en la que se ejecuta. Por ejemplo, al registrar la salida de la tabla en el archivo mediante un comando como Get-ChildItem Env:\Path > path.log en un sistema donde el ancho de la consola se establece en 80 columnas, la salida del archivo se trunca a 80 caracteres:

Name                         Value
----                         -----
Path                         C:\Program Files\PowerShell\7;C:\WINDOWS…

Teniendo en cuenta que el ancho de la consola puede establecerse arbitrariamente en sistemas en los que se ejecuta el script, es posible que prefiera que powerShell dé formato a la salida de la tabla a los archivos en función de un ancho que especifique en su lugar.

El Out-File cmdlet proporciona un parámetro Width que permite establecer el ancho que desea para la salida de la tabla. En lugar de tener que agregar -Width 2000 en todas partes que invoque Out-File, puede usar la $PSDefaultParameterValues variable para establecer este valor para todos los usos del Out-File cmdlet en un script. Y dado que los operadores de redirección (> y >>) son alias de forma eficaz para Out-File, establecer el Out-File:Width parámetro para todo el script afecta también al ancho de formato para los operadores de redireccionamiento. Coloque el siguiente comando cerca de la parte superior del script que se va a establecer Out-File:Width para todo el script:

$PSDefaultParameterValues['out-file:width'] = 2000

Aumentar el ancho de salida aumentará el consumo de memoria al registrar la salida con formato de tabla. Si registra una gran cantidad de datos tabulares en el archivo y sabe que puede obtenerlo con un ancho menor, use el ancho más pequeño.

En algunos casos, como Get-Service la salida, con el fin de usar el ancho adicional, deberá canalizar la salida antes de la salida Format-Table -AutoSize al archivo.

$PSDefaultParameterValues['out-file:width'] = 2000
Get-Service | Format-Table -AutoSize > services.log

Para obtener más información sobre $PSDefaultParameterValues, vea about_Preference_Variables.

Redireccionamiento de datos binarios

PowerShell no admite el redireccionamiento de datos binarios. Si redirige los datos de secuencia de bytes, PowerShell trata los datos como cadenas. Esta redirección da como resultado datos dañados.

Posible confusión con operadores de comparación

El > operador no se debe confundir con el operador de comparación Mayor que (a menudo se indica como > en otros lenguajes de programación).

Dependiendo de los objetos que se comparan, la salida que usa > puede parecer correcta (porque 36 no es mayor que 42).

PS> if (36 > 42) { "true" } else { "false" }
false

Sin embargo, una comprobación del sistema de archivos local puede ver que se escribió un archivo denominado 42 , con el contenido 36.

PS> dir

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------          1/02/20  10:10 am              3 42

PS> cat 42
36

Si se intenta usar la comparación < inversa (menor que), se produce un error del sistema:

PS> if (36 < 42) { "true" } else { "false" }
ParserError:
Line |
   1 |  if (36 < 42) { "true" } else { "false" }
     |         ~
     | The '<' operator is reserved for future use.

Si la comparación numérica es la operación -lt necesaria y -gt se debe usar. Para obtener más información, consulte el -gt operador en about_Comparison_Operators.

Consulte también