2010-09-27 9 views
10

con PowerShell 2.0:PowerShell 2.0 genera valori nulli tra i personaggi

write-output "ABCD" >> MyText.txt

scrive: un nul nul b c nul nul d

od spettacoli -c il nul come uno zero binario vero, \ 0, o: a \ 0 b \ 0 c \ 0 d \ 0 (e \ r \ 0 \ n \ 0)

Sto provando a generare un po 'di SQL, quindi io non pensare che questo lo farà Qualche idea su cosa sta succedendo e come usare write-output per ottenere solo i caratteri specificati?

Grazie!

+0

Grazie per questa domanda !! –

risposta

15

Ciò è dovuto al fatto che l'output di scrittura ha come valore predefinito la codifica del testo UTF-16, che è 2 byte per carattere. Quando si ha a che fare con testo che rientra nell'intervallo di codepage ASCII, il secondo byte di ciascun carattere sarà zero.

Questo è controllato dalla variabile globale $OutputEncoding, quindi è possibile impostarlo su ASCII.

Un'altra opzione è utilizzare il file di output del cmdlet, che ha un parametro di codifica esplicito. Ti suggerirei di utilizzare questo anziché il reindirizzamento dell'output, perché ti consente di non modificare l'ambiente globalmente (impostando la variabile di preferenza globale $OutputEncoding)

Utilizzando Out-File e impostando la codifica come ASCII, il tuo esempio sarà simile questo:

"abcd" | out-file "mytext.txt" -Encoding ASCII 

non essere consapevoli del fatto che non tutti i personaggi sono rappresentabili in ASCII, e si dovrebbe determinare se si tratta di una codifica appropriata per il vostro scopo. Personalmente in genere vado per UTF-8, poiché è equivalente ASCII quando i caratteri rientrano nell'intervallo ASCII da 0 a 127, ma gestisce anche caratteri internazionali. Obligatory link about text encoding.

+0

Grazie per la risposta rapida e completa. Nel XXI secolo non ci si dovrebbe mai aspettare ASCII - come ben si può dire dall'articolo di Joel citato sopra! – cvsdave

+0

Solo per chi guarda questo come risultato di ricerca in futuro, out-file supporta un flag -append, quindi quello che vorrei usare è: "abcd" | out-file "mytext.txt" -Encoding ASCII -append – cvsdave

+0

Grazie per aver risposto a questa domanda !! Sto imparando a poco a poco PowerShell. La tua risposta mi ha fatto risparmiare un sacco di tempo! –

2

Powershell funziona in modalità Unicode a 16 bit per impostazione predefinita, e comunque stai leggendo il file è probabile in un formato a 8 bit. Si potrebbe interpretare lo SQL in un'applicazione in grado di leggere UTF16, o, perché >> è zucchero sintattico per l'Out-File cmdlet, è possibile effettuare le seguenti operazioni, invece:

write-output "abcd" | out-file -path mytext.txt -Encoding "UTF8" -Append 
+0

Grazie per la tua risposta rapida - la risposta che mi serviva, ma posso contrassegnarne solo una come accettata. – cvsdave