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 Out-File cmdlet , que envía la salida del comando a un archivo de texto. Normalmente, se usa el Out-File cmdlet cuando es necesario usar sus parámetros, como los parámetros Encoding, Force``Width, o NoClobber .

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

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

Para obtener más información sobre las secuencias, vea about_Output_Streams.

Flujos de salida que se pueden redirigir

PowerShell admite el redireccionamiento de los siguientes flujos de salida.

Corriente # Descripción Introducido en Write Cmdlet
1 Éxito Corriente PowerShell 2.0 Write-Output
2 Error Corriente PowerShell 2.0 Write-Error
3 Advertencia Corriente PowerShell 3.0 Write-Warning
4 Detallado Corriente PowerShell 3.0 Write-Verbose
5 Depuración Corriente PowerShell 3.0 Write-Debug
6 Información Corriente PowerShell 5.0 Write-Information
* Todos los 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 redireccionamiento de PowerShell son los siguientes, donde representa n 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 la secuencia especificada a un archivo. n>
>> Anexe la secuencia especificada a un archivo. n>>
>&1 Redirige la secuencia especificada a la secuencia Correcto . n>&1

Nota

A diferencia de algunos shells de Unix, solo puede redirigir otras secuencias a la secuencia Success .

Ejemplos

Ejemplo 1: Redirigir errores y salidas a un archivo

Este ejemplo se ejecuta dir en un elemento que se realizará correctamente y otro que producirá un error.

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

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

Ejemplo 2: Envío de todos los datos de flujo correctos a un archivo

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

.\script.ps1 > script.log

Ejemplo 3: Envío de flujos correctos, de advertencia y de error 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 a la secuencia Correcto (que ahora también incluye todos los datos del flujo de advertencia)
  • > redirige la secuencia Correcto (que ahora contiene secuencias 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ía la salida de todas las secuencias de un script llamado script.ps1 a un archivo denominado script.log

.\script.ps1 *> script.log

Ejemplo 5: Supresión de todos Write-Host datos de flujo de información

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, vea 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 preferencia de acción pueden cambiar lo que se escribe en una secuencia determinada. El script de este ejemplo muestra cómo 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 ejecutamos este script, se nos pregunta cuando $ErrorActionPreference está establecido en Inquire.

PS C:\temp> .\test.ps1

Confirm
Cannot find path 'C:\not-here' because it does not 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.

Al examinar 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 redirección que no anexan datos (> y n>) sobrescriben el contenido actual del archivo especificado sin previo aviso.

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

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

Al escribir en archivos, los operadores de redirección usan codificación UTF8NoBOM . 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 o los operadores de redirección, PowerShell da formato a Out-File la salida de la tabla al archivo en función del ancho de la consola en la que se ejecuta. Por ejemplo, Get-ChildItem Env:\Path > path.log al registrar la salida de la tabla en un archivo mediante un comando como en un sistema donde el ancho de la consola está establecido 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 se puede establecer arbitrariamente en los sistemas en los que se ejecuta el script, puede preferir que la tabla de formato de PowerShell se ejecute en los archivos según el 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 en -Width 2000 cualquier lugar donde Out-Fileinvoque , $PSDefaultParameterValues puede usar la variable para establecer este valor para todos los usos Out-File del cmdlet en un script. Y dado que los operadores de redirección (> >>y ) son alias Out-Filede forma eficaz para , Out-File:Width establecer el parámetro para todo el script afecta también al ancho de formato de los operadores de redirección. Coloque el siguiente comando cerca de la parte superior del script para establecerlo 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 va a registrar una gran cantidad de datos tabulares en el archivo y sabe que puede obtener con un ancho más pequeño, use el ancho más pequeño.

En algunos casos, como Get-Service la salida, para usar el ancho adicional, Format-Table -AutoSize deberá canalizar la salida a través de antes de realizar la salida 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.

Posible confusión con los operadores de comparación

El > operador no debe confundirse con el operador de comparación Greater-than (a menudo se indica como > en otros lenguajes de programación).

En función de los objetos que se comparan, > la salida que se 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 ha escrito un 42 archivo llamado , con el contenido 36.

PS> dir

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

PS> cat 42
36

Al intentar 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 necesaria y -lt -gt se debe usar. Para obtener más información, vea el -gt operador en about_Comparison_Operators.

Consulte también