2009-11-10 1 views
11

Sto usando Sandcastle Helpfile Builder per produrre un fileguida (chm). Il progetto è un file .shfbproj, che è in formato XML, funziona con msbuild.PowerShell: utilizzando il reindirizzamento all'interno dello script produce un'uscita unicode. Come emettere testo ASCII a byte singolo?

voglio aggiornare automaticamente il testo piè di pagina che compare nel file chm generato. Io uso questo frammento:

$newFooter = "<FooterText>MyProduct v1.2.3.4</FooterText>"; 

get-content -Encoding ASCII $projFile.FullName | 
    %{$_ -replace '<FooterText>(.+)</FooterText>', $newFooter } > $TmpFile 

move-item $TmpFile $projFile.FullName -force 

L'uscita diretta al $ tmpfile è sempre una stringa multi-byte. Ma non lo voglio. Come imposto la codifica dell'output in ASCII?

Chiunque? Bueller? Chiunque?

+5

Grazie PowerShell per inadempiente ad un formato di output oscura (UCS-2 che è stato sostituito nel 1996 !! ??). utf8 sarebbe stato bene;) –

+0

Consulta anche: https://stackoverflow.com/questions/40098771/changing-powershells-default-output-encoding-to-utf-8 –

risposta

12

Si potrebbe cambiare la variabile $OutputEncoding prima di scrivere il file. L'altra opzione non è quella di utilizzare l'operatore >, ma invece il tubo direttamente a Out-File e utilizzare il parametro -Encoding.

+0

tomas, Gracias. – Cheeso

+1

l'operatore> è in realtà un alias per Out-File, che per default è utf. tomasr è corretto che dovresti usare out-file specificatamente per impostare la codifica. –

+0

@JamesPogran Che dire di '2>'? Io non sono sicuro di come, in PowerShell per eseguire un comando come 'cmd> out 2> err' attraverso i tubi per Out-File (specificando esplicitamente una codifica). Inoltre, "quale valore predefinito è utf"; cosa intendi per utf? utf8? UTF16? UTF-32? Pensavo che l'impostazione predefinita fosse UCS-2, non UTF (UCS Transfer Format); l'hai visto diversamente da qualche parte? –

6

L'operatore di reindirizzamento > è un "collegamento" a Out-File. codifica predefinita Out-File s' è Unicode, ma si può chnage a ASCII, in modo tubo per Out-File invece:

Get-Content -Encoding ASCII $projFile.FullName | 
    % { $_ -replace '<FooterText>(.+)</FooterText>', $newFooter } | 
    Out-File $tmpfile -Encoding ASCII 
+1

Zomfg cosa un dolore nel culo, http://stackoverflow.com/q/8216027/124486 Quindi, in sostanza 'generate_bat_file.pl> run_all.bat' è del tutto inutile, perché l'esecuzione di un file bat - anche in PowerShell - sarà causare un errore se il file '.bat' è codificato in UTF16. –

+0

concordato. Palaver totale – monojohnny

6

| sc filename fa il trucco (sc essendo un alias per Set-Content)

per >> filename uso | ac filename fa il trucco (ac essendo un alias per Add-Content)

2

ho scoperto che ho dovuto utilizzare il seguente:

write-output "First line" | out-file -encoding ascii OutputFileName 
write-output "Next line" | out-file -encoding ascii -append OutputFileName 
.... 

Modifica della codifica di output utilizzando:

$OutputEncoding = New-Object -typename System.Text.ASCIIEncoding 

non ha funzionato

0

Solo un piccolo esempio con corsi d'acqua, anche se mi rendo conto che questo non era la domanda iniziale.

C:\temp\ConfirmWrapper.ps1 -Force -Verbose 4>&1 6>&1 | Out-File -Encoding default -FilePath C:\temp\confirmLog.txt -Append 

uscita sarà l'informazione (6) e verbose (4) flussi in uscita (1) flusso e reindirizzare tutto che al di fuori del file con la codifica ANSI (default).