Cómo exportar a un archivo con PowerShell Out-File

La salida de los comandos de PowerShell se muestra de forma predeterminada en el terminal.

Pero en algunas situaciones, es más útil redirigir la salida a un archivo en PowerShell. Para ello, vamos a utilizar el cmdlet Out-File.

Hay diferentes formas de enviar los resultados de un script o comando de PowerShell a un archivo.

Incluso es posible mostrar la salida en la terminal y exportarla a un archivo al mismo tiempo. ¿Y sabía que también puede exportar solo los resultados de éxito, advertencia o error?

En este artículo, veremos cómo escribir la salida en un archivo en PowerShell. También explicaré cómo puede agregar a un archivo existente o cómo puede crear un archivo de registro.

Salida de escritura de Powershell en archivo

Hay un par de formas de escribir la salida de PowerShell en un archivo. Las formas más comunes son usar el Out-File cmdlet o el operador de redirección >.

Otras opciones son utilizar el Set-Content y Add-Content cmdlet. Nos vamos a centrar en los dos primeros, pero mencionaré brevemente la alternativa si es pertinente.

los Out-File cmdlet y operador de redirección > le permite escribir y agregar (>>) la salida de PowerShell a un archivo.

La diferencia entre los dos es que el primero acepta parámetros y el segundo no.

Con el cmdlet Out-File podemos usar los siguientes parámetros:

Parámetro Descripción
-Ruta de archivo Establecer la ubicación y el nombre del archivo
-Adjuntar Agregar la salida al contenido existente del archivo
-Fuerza Sobrescribir un archivo de solo lectura
-NoClobber Evitar la sobrescritura del archivo
-NoNuevaLínea No se escribirá ningún carácter de nueva línea.
-Ancho Limite el número de caracteres en cada línea (80 por defecto)
-Y si Ejecutar en modo de prueba
Parámetros del cmdlet Out-File

Operador de redirección de PowerShell

Sin embargo, el operador de redirección no tiene ningún parámetro. Pero tiene una ventaja en comparación con Out-File.

Cuando se usa el cmdlet Out-File, solo se exportan los resultados correctos, por lo que las advertencias o los errores no se escribirán en el archivo.

Cuando usamos el operador de redirección cuando podemos especificar qué transmisión queremos exportar:

Operador Descripción / Transmisión Escribir cmdlet
> Solo éxito Salida de escritura
2> solo errores Error de escritura
3> Solo advertencia Advertencia de escritura
4> Solo detallado Escritura detallada
5> Solo depurar Escritura-Depuración
6> Sólo información Escribir información
*> Todos
Operador de redirección de PowerShell

Explicaré más sobre las diferentes secuencias más adelante, pero primero echemos un vistazo a cómo podemos simplemente escribir la salida en un archivo en PowerShell.

Para escribir la salida en un archivo, todo lo que tiene que hacer es canalizar el Out-File cmdlet detrás de su script o comando y especifique la ruta. Si el archivo no existe, será creado por el cmdlet:

Get-Process -Name explorer | Out-File -FilePath c:\temp\process.txt

# Same as:
Get-Process -Name explorer > c:\temp\process.txt

# The results
 Get-Content C:\temp\process.txt

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
    132    94,56     158,22     131,45  123364   1 explorer

PS C:\>

Como puede ver, los resultados de la Get-Process cmdlet se almacena en el archivo process.txt:

powershell escribe la salida en el archivo
Salida de Powershell a archivo

Si no especifica ningún otro parámetro, el cmdlet Out-File y el operador de redirección sobrescribirán cualquier archivo existente de forma predeterminada. Podemos evitar esto agregando el -NoClobber parámetro al cmdlet

Get-Process -Name explorer | Out-File c:\temp\process.txt -NoClobber

Tenga en cuenta que no puede evitar sobrescribir con el operador de redirección

Si el archivo ya existe, se lanzará un error:

No sobrescribir el archivo
No sobrescriba los archivos existentes

Si desea generar un archivo dentro de un script, le recomiendo que use el Test-Path cmdlet primero para determinar si el archivo ya existe.

De esta manera, puede escribir una mejor solución, como agregar una fecha al nombre del archivo, en lugar de simplemente intentar escribir en él:

$exportPath = "C:\temp\process.txt"

If (Test-Path $exportPath) {
    # Show a warning or change the file name here
    Write-Warning "File already exists"
    $exportPath = "C:\temp\process-1.txt" # create something nice with a date or timestamp
}else{
    Get-Process -Name explorer | Out-File $exportPath -NoClobber
}

PowerShell anexar al archivo

En lugar de sobrescribir, también podemos agregar la salida al contenido existente del archivo.

Para esto, podemos usar el -append parámetro o utilice el operador de redirección >>. En ambos casos, el contenido de la salida se agregará al archivo existente.

También puede agregar a un archivo que no existe, ambos métodos crearán un nuevo archivo si el archivo especificado no existe.

# Append with the Out-File cmdlet
'Apple' | Out-File -FilePath C:\temp\fruits.txt -Append
Get-Content -Path c:\temp\fruits.txt

# Result
Apple

# Append with the redirect operator
'Pear' >> C:\temp\fruits.txt
Get-Content -Path c:\temp\fruits.txt

# Result
Apple
Pear

Al agregar la salida a un archivo existente, el contenido se colocará en una nueva línea.

Si desea tener el contenido en una sola línea, creando una cadena larga, deberá usar el cmdlet Out-File con el -NoNewLine parámetro.

El carácter de nueva línea se coloca después del valor que ha agregado al archivo. Por eso es importante agregar el -NoNewLine parámetro a la primera salida también.

# Note that you will need to specify NoNewLine for the first entry as well
'BlueBerry;' | Out-File -FilePath C:\temp\fruits.txt -NoNewline

# Appending more berries
'StrawBerry;' | Out-File -FilePath C:\temp\fruits.txt -Append -NoNewline
'BlackBerry;' | Out-File -FilePath C:\temp\fruits.txt -Append -NoNewline
'RaspBerry;' | Out-File -FilePath C:\temp\fruits.txt -Append -NoNewline
'CranBerry;' | Out-File -FilePath C:\temp\fruits.txt -Append -NoNewline

Para que el resultado sea más legible, he agregado una semicolumna a todos los valores. Como puede ver, todos los resultados están en la misma línea:

PowerShell anexar al archivo
Agregar al archivo sin nueva línea

Uso de contenido adicional de PowerShell

Otra opción para agregar contenido a un archivo es usar el cmdlet Add-Content.

Una de las mayores ventajas del cmdlet Add-Content es que le permite agregar contenido a varios archivos a la vez.

Al igual que con el cmdlet Out-File y el operador de redirección crea el cmdlet Add-Content un nuevo archivo si el archivo no existe.

Entonces, para simplemente agregar contenido a un archivo, podemos usar el siguiente comando:

Add-Content -Path c:\temp\file.txt -Value "New line to add"

Para agregar el mismo contenido a varios archivos, tenemos un par de parámetros que nos ayudan.

Podemos usar comodines en la ruta para especificar los archivos que queremos actualizar. Además, podemos excluir nombres de archivos e incluso usar un filtro.

El siguiente ejemplo agregará la fecha actual a todos los archivos TXT en la ruta c:\temp\files, excepto en el archivo con Léame en el nombre del archivo:

Add-Content -Path C:\temp\files\*.txt -Value (Get-Date) -Exclude "readme*"

Todos los archivos, excepto los archivos Léame, están actualizados:

anexar al archivo
Contenido adicional de PowerShell

Tanto los parámetros de inclusión como de exclusión le permiten especificar una matriz de cadenas de archivos que desea o no actualizar.

Si tomamos el ejemplo anterior, también podríamos usar el parámetro de filtro para seleccionar solo los archivos que incluyen la palabra registro:

Add-Content -Path C:\temp\files\* -Value (Get-Date) -Filter "*log*"

Escriba solo errores, advertencias o éxito en el archivo

El cmdlet de archivo de salida solo escribirá el resultado exitoso de su comando o secuencia de comandos en un archivo. Pero a veces también desea que se emitan advertencias o errores.

Para lograr esto, podemos usar el operador de redirección. Le permite especificar qué secuencia desea enviar a un archivo.

Tomemos el siguiente script como ejemplo:

Function Get-ProcessCpu {
    param(
        [Parameter(Mandatory = $true)]$name
    )
    Get-Process -Name $name | select cpu
}
Get-ProcessCpu -name "explorer2" | Out-File C:\temp\process.txt

El proceso «Explorer2» no existe, por lo que el cmdlet Get-Process generará un error. Si ejecutamos el script de esta manera, el archivo process.txt estará completamente vacío.

Sin embargo, si usamos el operador de redirección, podemos especificar qué transmisión queremos generar.

# Write all results to the file:
Get-ProcessCpu -name "explorer2" *> C:\temp\process.txt

# Write only the error to the file:
Get-ProcessCpu -name "explorer2" 2> C:\temp\process-error-log.txt

# Write only warnings to a file:
Get-ProcessCpu -name "explorer2" 3> C:\temp\process-error-log.txt

Como puede ver, el error se escribe en el archivo de texto con el operador de redirección:

powershell escribe la salida en el archivo
Escritura de Powershell en el archivo de registro

Escritura de Powershell en el archivo de registro

La mejor opción para escribir en un archivo de registro es usar el cmdlet Start-Transcript, pero también podemos escribir nuestra propia función de registro usando el cmdlet Add-Content o el operador de redirección.

El uso del operador de redirección limitará sus posibilidades, pero es una excelente manera si solo desea escribir los errores de un script en un archivo de registro:

Function Get-ProcessCpu {
    param(
        [Parameter(Mandatory = $true)]$name
    )
    Get-Process -Name $name | select cpu
}

# Write only errors to a log file
Get-ProcessCpu -name "explorer2" 2>> "C:\temp\files\$env:computername-process.log"

Pero cuando está escribiendo mensajes en un archivo de registro, probablemente desee tener un poco más de control.

Con los archivos de registro es importante que podamos ver cuándo ocurrió el evento y la gravedad del evento.

Entonces, lo que queremos hacer es agregar una marca de tiempo y un nivel de evento al mensaje de registro.

De esta manera, podemos leer fácilmente el archivo de registro e identificar cualquier error que haya ocurrido.

# Set log file path
$logFile = "C:\temp\files\$env:computername-process.log"

Function Write-Log {
    param(
        [Parameter(Mandatory = $true)][string] $message,
        [Parameter(Mandatory = $false)]
        [ValidateSet("INFO","WARN","ERROR")]
        [string] $level = "INFO"
    )

    # Create timestamp
    $timestamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")

    # Append content to log file
    Add-Content -Path $logFile -Value "$timestamp [$level] - $message"
}

Write-Log -level ERROR -message "String failed to be a string"

La función anterior es un ejemplo de un creador de archivos de registro simple para PowerShell que le permite escribir mensajes (eventos) en un archivo de registro con la gravedad y la marca de tiempo.

Escritura de Powershell en el archivo de registro
Escritura de Powershell en el archivo de registro

Terminando

Como ha visto, hay varias formas en PowerShell de enviar los resultados a un archivo.

Para generar rápidamente algo en un archivo, puede usar el operador de redirección o el cmdlet Out-File.

Cuando desee exportar el resultado a un archivo CSV, asegúrese de leer este artículo.

También es posible reemplazar contenido dentro de un archivo usando el método Reemplazar.

Si tiene alguna pregunta, simplemente deje un comentario a continuación.

Otros artículos relacionados

Obtenga el estado de MFA de los usuarios de Office 365 con Microsoft Graph

Obtenga el estado de MFA de los usuarios de Office 365 con Microsoft Graph

Hacer un seguimiento del estado de MFA de su usuario es importante para mantener protegido a su arrendatario. Por ahora, ...
Leer Más
Cómo exportar a un archivo con PowerShell Out-File

Cómo exportar a un archivo con PowerShell Out-File

La salida de los comandos de PowerShell se muestra de forma predeterminada en el terminal. Pero en algunas situaciones, es ...
Leer Más
Cómo usar PowerShell Reemplazar para reemplazar una cadena o un carácter

Cómo usar PowerShell Reemplazar para reemplazar una cadena o un carácter

¿Necesita reemplazar una cadena o un carácter en PowerShell? ¿O desea insertar bloques de texto completos en un archivo? Entonces ...
Leer Más
Use Azure Automation y PowerShell para automatizar las tareas de Office 365

Use Azure Automation y PowerShell para automatizar las tareas de Office 365

Azure Automation es una de las herramientas más populares para ejecutar scripts de PowerShell en la nube. No solo puede ...
Leer Más
Eliminar carpetas vacías en SharePoint Online

Eliminar carpetas vacías en SharePoint Online

Después de fusionar carpetas duplicadas en SharePoint Online, necesitaba eliminar las carpetas vacías. Esto es algo que también podemos hacer ...
Leer Más
Los 10 principales comandos de PowerShell que debe conocer

Los 10 principales comandos de PowerShell que debe conocer

PowerShell es realmente poderoso y puede hacer que su trabajo diario sea mucho más fácil. Con todos los módulos que ...
Leer Más

Deja un comentario