raw - powershell read file
Powershell set-content y out-file ¿cuál es la diferencia? (4)
Aquí hay un resumen de lo que he deducido, después de unos meses de experiencia con Powershell, y algunos experimentos científicos. Nunca encontré nada de esto en la documentación :(
[ Actualización: gran parte de esto ahora parece estar mejor documentado.]
Bloqueo de lectura y escritura
Mientras Out-File
está ejecutando, otra aplicación puede leer el archivo de registro.
Mientras Set-Content
está ejecutando, otras aplicaciones no pueden leer el archivo de registro. Por lo tanto, nunca use Set-Content
para registrar comandos de ejecución larga.
Codificación
Out-File
guarda en la Unicode
( UTF-16LE
) de manera predeterminada (aunque esto se puede especificar), mientras que Set-Content
predeterminado ASCII
( US-ASCII
) en PowerShell 3+ (esto también se puede especificar). En PowerShells anteriores, Set-Content
escribió contenido en la codificación Default
(ANSI).
Nota del editor : PowerShell a partir de la versión 5.1 aún se establece de manera predeterminada en la codificación predeterminada cultural ("ANSI"), a pesar de lo que afirma la documentación. Si ASCII fuera el predeterminado, los caracteres que no son ASCII como ü
se convertirían a literal ?
, pero ese no es el caso: ''ü'' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq ''?''
''ü'' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq ''?''
cede $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 al mezclarlos se dañará el texto, así que siempre especifique una codificación.
Formateo
Como explicó Bartek, Out-File
guarda el elegante formato de la salida, como se ve en la terminal. Entonces en una carpeta con dos archivos, el comando dir | out-file out.txt
dir | out-file out.txt
crea un archivo con 11 líneas.
Donde como Set-Content
guarda una representación más simple. En esa carpeta con dos archivos, el comando dir | set-content sc.txt
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 no puedo describirlo todavía.
Creación de archivo
Set-Content
no crea confiablemente un archivo vacío cuando Out-File
:
En una carpeta vacía, el comando dir | out-file out.txt
dir | out-file out.txt
crea un archivo, mientras que dir | set-content sc.txt
dir | set-content sc.txt
no lo hace.
Variable de tubería
Set-Content
toma el nombre de archivo de la tubería; permitiéndole configurar un número de contenido de archivos a un valor fijo.
Out-File
toma los datos a partir de la canalización; 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
- Corriente
- UseTransaction
Out-File
incluye los siguientes parámetros adicionales:
- Adjuntar
- NoClobber
- Anchura
Para obtener más información sobre cuáles son esos parámetros, consulte la ayuda; por ejemplo, get-help out-file -parameter append
.
En Powershell, ¿cuál es la diferencia entre out-file
y set-content
? Editar: ¿O add-content
y out-file -append
? ¿ out-file -append
?
He encontrado que si utilizo ambas contra el mismo archivo, el texto está mal mojibaked.
(Una segunda pregunta menor, >
es un alias para out-file
, ¿no?)
Bueno, 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 usará el método .ToString () en la entrada. Out-File usará el formateo predeterminado.
asi que:
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 (lo mismo 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 un parámetro de ancho que le ayuda a evitar esto. Además, con los operadores de redirección no puede decidir qué codificación usar.
HTH Bartek
Out-File
tiene el comportamiento de sobrescribir la ruta de salida a menos que se establezca el -NoClobber
y / o -Append
. Add-Content
agregará contenido si la ruta de salida ya existe de manera predeterminada (si es que puede). Ambos crearán el archivo si aún no existe uno.
Otra diferencia interesante es que Add-Content
creará un archivo codificado en ASCII de manera predeterminada y Out-File
creará un pequeño archivo endian codificado en Unicode por defecto.
>
es un azúcar sintáctico alias para Out-File
. Es Out-File
con algunos ajustes de parámetros predefinidos.
Set-Content
admite -Encoding Byte
, mientras que Out-File
no.
Entonces, cuando desee escribir datos binarios o un resultado de Text.Encoding#GetBytes()
en un archivo, debe usar Set-Content
.