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… 🙂
- Out-File tiene -Append (-NoClober está ahí para evitar sobrescribir) que agregará contenido. Pero esta no es la misma bestia.
- 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.