Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
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
Out-File, que envía la salida del comando a un archivo de texto. Normalmente, se usa el cmdletOut-Filecuando necesite usar sus parámetros, como los parámetrosEncoding,Force,WidthoNoClobber.Use el cmdlet
Tee-Object, 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. Redirigir la salida de un comando de PowerShell (cmdlet, función, script) mediante el operador de redirección (
>) es funcionalmente equivalente a canalizar aOut-Filesin parámetros adicionales. PowerShell 7.4 cambió el comportamiento del operador de redirección cuando se usa para redirigir la secuencia stdout de un comando nativo.
Para 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.
| Transmisión # | Descripción | Introducida en | Write Cmdlet |
|---|---|---|---|
| 1 | Éxito Transmisión | PowerShell 2.0 | Write-Output |
| 2 | Error Transmisión | PowerShell 2.0 | Write-Error |
| 3 | Advertencia Transmisión | PowerShell 3.0 | Write-Warning |
| 4 | Detallado Transmisión | PowerShell 3.0 | Write-Verbose |
| 5 | Depuración Transmisión | PowerShell 3.0 | Write-Debug |
| 6 | Información Transmisión | PowerShell 5.0 |
Write-Information, Write-Host |
| * | Todos los flujos | PowerShell 3.0 |
También hay un flujo Progress en PowerShell, pero no admite el redireccionamiento.
Importante
Los flujos de Correcto y Error son similares a los flujos stdout y stderr de otros shells. Sin embargo, stdin no está conectado a la pipeline de PowerShell para la entrada.
Operadores de redireccionamiento de PowerShell
Los operadores de redireccionamiento de PowerShell son los siguientes, donde n representa el número de secuencia. La transmisión Éxito ( 1 ) es el predeterminado si no se especifica ningún transmisión.
| Operator | Descripción | Sintaxis |
|---|---|---|
> |
Envíe una secuencia especificada a un archivo. | n> |
>> |
Añade el transmisión especificado a un archivo. | n>> |
>&1 |
Redirige la transmisión especificada a la transmisión de éxito. | n>&1 |
Nota
A diferencia de algunos shells de Unix, solo puede redirigir otros flujos a la transmisión de Éxito.
Redireccionamiento de la salida desde comandos nativos
PowerShell 7.4 cambió el comportamiento de los operadores de redirección cuando se utilizan para redirigir el flujo stdout de un comando nativo. Los operadores de redireccionamiento ahora conservan los datos de secuencia de bytes al redirigir la salida desde un comando nativo. PowerShell no interpreta los datos redirigidos ni agrega ningún formato adicional. Para obtener más información, vea ejemplo de #7.
Examples
Ejemplo 1: Redirigir errores y resultados a un archivo
En este ejemplo se ejecuta dir en un elemento que tiene éxito y otro que falla.
dir C:\, fakepath 2>&1 > .\dir.log
Usa 2>&1 para redirigir el flujo de error de a el flujo de éxito de, y > para enviar el flujo de éxito resultante de a un archivo llamado dir.log
Ejemplo 2: Enviar todos los datos del flujo de éxito a un archivo
Este ejemplo envía todos los datos de la transmisión Éxito a un archivo llamado script.log.
.\script.ps1 > script.log
Ejemplo 3: Enviar las secuencias de Éxito, Advertencia y 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>&1redirige la transmisión Advertencia a la transmisión Éxito. -
2>&1redirige el flujo de Error de al flujo de Éxito de (que ahora también incluye todos los datos del flujo de Advertencia de) -
>redirige el flujo de éxito de (que ahora contiene tanto el flujo de advertencia como el flujo de error ) a un archivo denominadoC:\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 denominado script.ps1 a un archivo denominado script.log.
.\script.ps1 *> script.log
Ejemplo 5: Suprimir todos los datos de Write-Host y de transmisión de información.
En este ejemplo se suprimen todos los datos del flujo de información. Para obtener más información sobre cmdlets de transmisión 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 parámetros de las acciones preferidas pueden cambiar lo que se escribe en una transmisión determinada. El script de este ejemplo muestra cómo el valor de $ErrorActionPreference afecta a lo que se escribe en la transmisión de Error.
$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'
Al ejecutar este script, se nos notifica cuando $ErrorActionPreference se establece en Inquire.
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
Ejemplo 7: Redireccionamiento de datos binarios desde un comando nativo
A partir de PowerShell 7.4, PowerShell conserva los datos de secuencia de bytes al redirigir la secuencia stdout de un comando nativo a un archivo o al canalizar datos de secuencia de bytes a la secuencia stdin de un comando nativo.
Por ejemplo, con el comando nativo curl puede descargar un archivo binario y guardarlo en el disco mediante el redireccionamiento.
$uri = 'https://github.com/PowerShell/PowerShell/releases/download/v7.3.7/powershell-7.3.7-linux-arm64.tar.gz'
# native command redirected to a file
curl -s -L $uri > powershell.tar.gz
También puede canalizar los datos de secuencia de bytes a la secuencia stdin de otro comando nativo. En el ejemplo siguiente se descarga un archivo TAR comprimido mediante curl.
Los datos del archivo descargados se transmiten al comando tar para extraer el contenido del archivo.
# native command output piped to a native command
curl -s -L $uri | tar -xzvf - -C .
También puede canalizar la salida de secuencia de bytes de un comando de PowerShell a la entrada del comando nativo. En los ejemplos siguientes se usa Invoke-WebRequest para descargar el mismo archivo TAR que el ejemplo anterior.
# byte stream piped to a native command
(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
# bytes piped to a native command (all at once as byte[])
,(Invoke-WebRequest $uri).Content | tar -xzvf - -C .
Esta característica no admite datos de secuencia de bytes al redirigir la salida stderr a stdout. Al combinar las secuencias stderr y stdout, las secuencias combinadas se tratan como datos de cadena.
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 de solo lectura, oculto o archivo del sistema, se produce un error en el redireccionamiento . Los operadores de redirección de adición (>> y n>>) no escriben en un archivo de solo lectura, sino que añaden contenido a un archivo del sistema o un archivo oculto.
Para forzar la redirección del contenido a un archivo de sistema, oculto o de solo lectura, use el cmdlet Out-File con su parámetro Force.
Al escribir en archivos, los operadores de redireccionamiento usan la 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 cmdlet Out-File con su parámetro Encoding.
Ancho de la 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 en 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 la salida de la tabla de formato de PowerShell a los archivos se basen en un ancho que especifique en su lugar.
El cmdlet Out-File proporciona un parámetro Width que le 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 variable $PSDefaultParameterValues para establecer este valor para todos los usos del cmdlet Out-File en un script. Y dado que los operadores de redireccionamiento (> y >>) son alias de forma eficaz para Out-File, establecer el parámetro Out-File:Width para todo el script afecta también al ancho de formato para los operadores de redirección. Coloque el siguiente comando cerca de la parte superior del script para 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 va a registrar muchos 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 la salida Get-Service, para usar el ancho adicional, deberá canalizar la salida a través de Format-Table -AutoSize antes de guardarla en un 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 operadores de comparación
El operador > no debe confundirse 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
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, se deben usar -lt y -gt. Para obtener más información sobre el operador -gt, consulte about_Comparison_Operators.