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

在脚本中使用重定向生成unicode输出。如何发出单字节ASCII文本?,unicode,powershell,Unicode,Powershell,我正在使用生成帮助文件(.chm)。该项目是一个.shfbproj文件,为XML格式,可与msbuild一起使用 我想自动更新生成的.chm文件中显示的页脚文本。我使用这个片段: $newFooter = "<FooterText>MyProduct v1.2.3.4</FooterText>"; get-content -Encoding ASCII $projFile.FullName | %{$_ -replace '<FooterText>

我正在使用生成帮助文件(.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
$newFooter=“MyProduct v1.2.3.4”;
获取内容-编码ASCII$projFile.FullName|
%{$\替换“(.+)”,$newFooter}>$TmpFile
移动项目$TmpFile$projFile.FullName-强制

指向$TmpFile的输出总是一个多字节字符串。但我不想那样。如何将输出的编码设置为ASCII

您可以在写入文件之前更改变量。另一个选项不是使用
操作符,而是直接通过管道连接到
输出文件
并使用
-Encoding
参数。

重定向操作符是指向
输出文件
的“快捷方式”<代码>输出文件的默认编码是Unicode,但您可以将其更改为ASCII,因此管道改为
输出文件

Get-Content -Encoding ASCII $projFile.FullName |
    % { $_ -replace '<FooterText>(.+)</FooterText>', $newFooter } |
    Out-File $tmpfile -Encoding ASCII
Get Content-Encoding ASCII$projFile.FullName|
%{$\替换“(.+)”,$newFooter}|
输出文件$tmpfile-编码ASCII

| sc filename
起作用(sc是集合内容的别名)


对于
>文件名
使用
| ac文件名
会起作用(ac是添加内容的别名)

我发现我必须使用以下方法:

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

不起作用

只是一个使用流的小例子,尽管我意识到这不是最初的问题

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

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

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

$PSDefaultParameterValues=@{'out-file:encoding'='ascii'}
然后类似的内容将生成一个ascii文件:

echo hi > out

在powershell 6和7中,out文件的默认编码更改为utf8 no bom。

操作符实际上是out文件的别名,默认为utf。tomasr是正确的,您应该专门使用out file来设置编码。@JamesPogran关于
2>
?我不知道如何在PowerShell中通过管道运行命令,如
cmd>out 2>err
(显式指定编码)。另外,“默认为utf”;你说的utf是什么意思?utf8?utf16?utf32?我认为默认的是UCS-2,而不是UTF(UCS传输格式);您在其他地方看到过它吗?
Out File-Encoding
建议很有帮助,但是
$outpunecoding
不适用于这里,因为它与
/
无关。它的唯一目的是定义从PowerShell向外部程序发送数据时要使用的编码
git diff HEAD~1 HEAD | Out File-Encoding ascii patch.txt
Zomfg真让人讨厌,所以,本质上,
generate_bat_file.pl>run_all.bat
是完全无用的,因为如果
.bat
文件是UTF16编码的,则执行bat文件(即使在PowerShell中)也会导致错误。感谢PowerShell默认为模糊的输出格式(UCS-2在1996年被替换!!??)。utf8就可以了;)另请参见:也可以将编码与“>>”混合使用。我会坚持设置内容和添加内容。@LimitedAtonment:是的,这个决定很不幸,但幸运的是,这个问题在PowerShell Core(v6+)中得到了纠正,现在默认的是无BOM的UTF-8。顺便说一句:Windows PowerShell默认情况下用于
/
输出文件
(但不用于
设置内容
)的是UTF-16LE(这是Unicode标准的一部分,不会消失),而不是UCS-2(这确实是过时的,因为它不能代表所有Unicode字符),但请注意,在Windows PowerShell中,这是一个错误。还值得一提的是(无BOM)UTF-8是PowerShell Core(v6+)在所有cmdlet中的默认编码。实际上,
$outpunecoding
不适用于此处,因为它与
/
>
>
/
输出文件(或任何cmdlet,就此而言)无关。其唯一目的是定义从PowerShell向外部程序发送数据时要使用的编码。然而,如果对投票率高但部分不正确的被接受答案发表评论(我已经发表了评论,希望答案得到修正),那么这一观察结果会得到更多的曝光。这样,您就不需要发布自己的答案(其余答案与Shay Levy以前的答案相同)。
也可以在同一个文件中混合编码。