Saltar al contenido

PowerShell Set-Content y Out-File: ¿cuál es la diferencia?

Poseemos la mejor solución que hallamos por todo internet. Queremos que te sirva de ayuda y si puedes comentarnos cualquier detalle que nos pueda ayudar a crecer hazlo con libertad.

Solución:

Aquí hay un resumen de lo que he deducido, después de algunos meses de experiencia con PowerShell y algunos experimentos científicos. Nunca encontré nada de esto en la documentación 🙁

[Update: Much of this now appears to be better documented.]

Bloqueo de lectura y escritura

Tiempo Out-File se está ejecutando, otra aplicación puede leer el archivo de registro.

Tiempo Set-Content se está ejecutando, otras aplicaciones no pueden leer el archivo de registro. Por lo tanto nunca usar Set-Content para registrar comandos de ejecución prolongada.

Codificación

Out-File ahorra en el Unicode (UTF-16LE) codificación por defecto (aunque esto se puede especificar), mientras que Set-Content por defecto a ASCII (US-ASCII) en PowerShell 3+ (esto también se puede especificar). En versiones anteriores de PowerShell, Set-Content escribió contenido en el Default (ANSI) codificación.

Nota del editor: PowerShell a partir de la versión 5.1 todavía predeterminado a la cultura específica Default (“ANSI”), a pesar de lo que dice la documentación. Si ASCII fuera el valor predeterminado, los caracteres que no son ASCII, como ü se convertiría en literal?pero eso es no el caso: 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?' rendimientos $False.

PS > $null | out-file outed.txt
PS > $null | set-content set.txt
PS > md5sum *
f3b25701fe362ec84616a93a45ce9998 *outed.txt
d41d8cd98f00b204e9800998ecf8427e *set.txt

Esto significa que los valores predeterminados de dos comandos son incompatibles y mezclarlos dañará el texto, así que siempre especifique una codificación.

Formateo

Como explicó Bartek, Out-File guarda el formato elegante de la salida, como se ve en la terminal. Entonces, en una carpeta con dos archivos, el comando dir | out-file out.txt crea un archivo con 11 líneas.

Mientras que Set-Content guarda una representación más simple. En esa carpeta con dos archivos, el comando dir | set-content sc.txt crea un archivo con dos líneas. Para emular la salida en la terminal:

PS > dir | ForEach-Object $_.ToString()
out.txt
sc.txt

Creo que este formato tiene una consecuencia para los saltos de línea, pero aún no puedo describirlo.

creación de archivos

Set-Content no crea de forma fiable un archivo vacío cuando Out-File haría:

En una carpeta vacía, el comando dir | out-file out.txt crea un archivo, mientras que dir | set-content sc.txt no.

Variable de canalización

Set-Content toma el nombre de archivo de la canalización; lo que le permite establecer una serie de contenidos de los archivos a un valor fijo.

Out-File toma los datos del pipeline; actualizar el contenido de un solo archivo.

Parámetros

Set-Content incluye los siguientes parámetros adicionales:

  • Excluir
  • Filtrar
  • Incluir
  • Pasar a través de
  • Arroyo
  • UseTransaction

Out-File incluye los siguientes parámetros adicionales:

  • Adjuntar
  • NoClobber
  • Ancho

Para obtener más información sobre cuáles son esos parámetros, consulte la ayuda; p.ej get-help out-file -parameter append.

Out-File tiene el comportamiento de sobrescribir la ruta de salida a menos que el -NoClobber y/o el -Append se establece la bandera. Add-Content agregará contenido si la ruta de salida ya existe de forma predeterminada (si es posible). Ambos crearán el archivo si aún no existe uno.

Otra diferencia interesante es que Add-Content creará un archivo codificado en ASCII por defecto y Out-File creará un archivo codificado en unicode little endian de forma predeterminada.

> es un alias azúcar sintáctico para Out-File. Es Out-File con algunos ajustes de parámetros predefinidos.

Bueno, yo no estaría de acuerdo… 🙂

  1. Out-File tiene -Append (-NoClober está ahí para evitar sobrescribir) que agregará contenido. Pero esta no es la misma bestia.
  2. comando | Add-Content utilizará el método .ToString() en la entrada. Out-File utilizará el formato predeterminado.

entonces:

ls | Add-Content test.txt

y

ls | Out-File test.txt

le dará resultados totalmente diferentes.

Y no, ‘>’ no es un alias, es un operador de redirección (igual que en otros shells). Y tiene una limitación muy seria… Cortará las líneas de la misma forma en que se muestran. Out-File tiene el parámetro -Width que lo ayuda a evitar esto. Además, con los operadores de redirección no puede decidir qué codificación usar.

HTH Bartek

Comentarios y valoraciones

Recuerda dar difusión a esta sección si lograste el éxito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *