在脚本中使用重定向会生成unicode输出。如何发出单字节ASCII文本?

时间:2009-11-10 11:47:37

标签: unicode powershell

我正在使用Sandcastle Helpfile Builder来生成帮助文件(.chm)。该项目是一个.shfbproj文件,它是XML格式,与msbuild一起使用。

我想自动更新生成的.chm文件中显示的页脚文本。我使用这个片段:

$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

指向$ TmpFile的输出始终是一个多字节字符串。但我不希望这样。如何将输出的编码设置为ASCII?

6 个答案:

答案 0 :(得分:15)

您可以在写入文件之前更改$OutputEncoding变量。另一种选择是不使用&gt;运算符,而是直接管道输出到Out-File并使用-Encoding参数。

答案 1 :(得分:9)

>重定向运算符是Out-File的“快捷方式”。 Out-File的默认编码是Unicode,但您可以将其编码为ASCII,因此请转而使用Out-File

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

答案 2 :(得分:7)

| sc filename可以解决这个问题(sc是Set-Content的别名)

for >> filename使用| ac filename可以解决问题(ac是Add-Content的别名)

答案 3 :(得分:2)

我发现我必须使用以下内容:

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

使用以下方法更改输出编码:

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

无效

答案 4 :(得分:1)

您可以将输出文件的默认编码设置为ascii:

$PSDefaultParameterValues=@{'out-file:encoding'='ascii'}

然后,类似这样的结果将生成一个ascii文件:

echo hi > out

在Powershell 6和7中,输出文件的默认编码已更改为utf8 no bom。

答案 5 :(得分:0)

只是使用流的一个小例子,虽然我意识到这不是原始问题。

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

将输出信息(6)和详细(4)流输出到输出(1)流,并使用ANSI(默认)编码将所有这些流重定向到输出文件。