Ecco un riepilogo di ciò che ho dedotto, dopo alcuni mesi di esperienza con PowerShell, e alcune sperimentazioni scientifiche. Non ho mai trovato niente di tutto questo nella documentazione :(
[ Aggiornamento: gran parte di questo ora sembra essere meglio documentato.]
Lettura e scrittura del blocco
Mentre Out-File
è in esecuzione, un'altra applicazione può leggere il file di registro.
Durante l' Set-Content
esecuzione, altre applicazioni non possono leggere il file di registro. Quindi non usare maiSet-Content
per registrare comandi a esecuzione prolungata.
Codifica
Out-File
salva nella codifica Unicode
( UTF-16LE
) per impostazione predefinita (sebbene questo possa essere specificato), mentre il Set-Content
valore predefinito è ASCII
( US-ASCII
) in PowerShell 3+ (anche questo può essere specificato). Nelle versioni precedenti di PowerShell, Set-Content
scriveva il contenuto nella Default
codifica (ANSI).
Nota del redattore : PowerShell a partire dalla versione 5.1 utilizza ancora la Default
codifica specifica delle impostazioni cultura ("ANSI"), nonostante ciò che afferma la documentazione. Se ASCII fosse l'impostazione predefinita, i caratteri non ASCII come ü
verrebbero convertiti in letterali ?
, ma non è così: 'ü' | Set-Content tmp.txt; (Get-Content tmp.txt) -eq '?'
produce $False
.
PS > $null | out-file outed.txt
PS > $null | set-content set.txt
PS > md5sum *
f3b25701fe362ec84616a93a45ce9998 *outed.txt
d41d8cd98f00b204e9800998ecf8427e *set.txt
Ciò significa che i valori predefiniti di due comandi sono incompatibili e mescolarli danneggerà il testo, quindi specifica sempre una codifica.
Formattazione
Come ha spiegato Bartek, Out-File
salva la formattazione di fantasia dell'output, come si vede nel terminale. Quindi in una cartella con due file, il comando dir | out-file out.txt
crea un file con 11 righe.
Mentre Set-Content
salva una rappresentazione più semplice. In quella cartella con due file, il comando dir | set-content sc.txt
crea un file con due righe. Per emulare l'output nel terminale:
PS > dir | ForEach-Object {$_.ToString()}
out.txt
sc.txt
Credo che questa formattazione abbia una conseguenza per le interruzioni di riga, ma non posso ancora descriverla.
Creazione di file
Set-Content
non crea in modo affidabile un file vuoto quando Out-File
:
In una cartella vuota, il comando dir | out-file out.txt
crea un file, mentre dir | set-content sc.txt
non lo fa.
Variabile pipeline
Set-Content
prende il nome del file dalla pipeline; consentendo di impostare un numero di contenuti di file su un valore fisso.
Out-File
prende i dati come dalla pipeline; aggiornare il contenuto di un singolo file.
Parametri
Set-Content
include i seguenti parametri aggiuntivi:
- Escludere
- Filtro
- Includere
- Passare attraverso
- Stream
- UseTransaction
Out-File
include i seguenti parametri aggiuntivi:
- Aggiungere
- NoClobber
- Larghezza
Per ulteriori informazioni su quali sono questi parametri, fare riferimento alla guida; es get-help out-file -parameter append
.
Set-Content
codifica predefinita: tradotta in(Get-Culture).Textinfo.ANSICodePage
(Windows 8.1, Powershell 4.0, CurrentCulturecs-CZ
, CurrentUICultureen-GB
, ANSICodePage1250
, OEMCodePage852
, testato utilizzando'řž'
stringhe con codici diversi nelle tabelle codici precedenti).