在脚本中使用重定向生成unicode输出。如何发出单字节ASCII文本?
我正在使用生成帮助文件(.chm)。该项目是一个.shfbproj文件,为XML格式,可与msbuild一起使用 我想自动更新生成的.chm文件中显示的页脚文本。我使用这个片段:在脚本中使用重定向生成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>
$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以前的答案相同)。
也可以在同一个文件中混合编码。