【发布时间】:2020-12-08 09:39:52
【问题描述】:
我有一个 powershell 脚本,它通过 Write-Output 返回一些字符串。 我希望这些行是没有 bom 的 UTF8。我不想要全局设置,我只是希望这对我当时写的那几行有效。
另一个问题帮助我明白了一点:Using PowerShell to write a file in UTF-8 without the BOM
我从其中一个答案中获得灵感,编写了以下代码:
$mystr = "test 1 2 3"
$mybytes = [Text.Encoding]::UTF8.GetBytes($mystr)
$OutStream = [console]::OpenStandardOutput()
$OutStream.Write($mybytes,0,$TestBytes.Length)
$OutStream.Close()
但是,此代码仅写入标准输出,如果我尝试重定向它,它会忽略我的请求。换句话说,将该代码放入 test.ps1 并运行 test.ps1 >out.txt 仍然会打印到控制台而不是 out.txt。
有人可以推荐我如何编写此代码,以防用户通过 > 将我的 PS 的输出重定向到文件,该输出是没有 BOM 的 UTF8?
【问题讨论】:
-
你的问题标题没有意义。 UTF-8 和 BOM 与文件有关,与控制台无关。您的描述文字并没有使它更清晰。你想达到什么目标,它是如何失败的?你不能改变用户重定向他的东西的方式。告诉用户使用
Out-File -Encoding ascii(如果您不需要任何特殊字符)。 -
我不同意这是没有意义的。这是一个 PS 怪癖。换句话说,CMD,“echo hello world > test.txt”按预期工作,并准确写入我管道的字节。在 PS 中,如果我执行 Write-Output "hello world" > test.txt,它会假设我正在写什么并插入一个 BOM。我在问是否有办法重定向二进制输出(因此是字节数组)。但是我会关闭,因为显然这不是 PS 的工作方式。
-
您确实要求“将没有 BOM 的 UTF8 写入控制台”。控制台没有 UTF8 或 BOM 的概念。写入文件时使用编码,而不是在将文本打印到控制台时使用。
-
大多数(如果不是全部)shell 允许您对字符串进行预编码,并将原始输入(例如二进制)写出,可以重定向到文件。 Powershell 没有,这很好。这个问题是从-3 到+1,我投票关闭它。如果您认为这是一个不好的问题,也可以投票关闭它。我希望我可以删除它,但我不想删除乐于助人的人的答案。我不认为这是一个坏问题,当您尝试与您可能有经验的其他 shell 等效时。您对我的问题没有意义的解释对于那些刚接触 powershell 的人来说并不明显。
-
现在我相信你不明白 UTF-8 和 BOM 的真正含义,因为你仍然没有意义。在 PowerShell 中,您还可以构造任何字节数组并将其写入文件(参见此处:cyber-defense.sans.org/blog/2010/02/11/…)。因此,如果您想这样做,您可以自己构建一个 BOM 并将所有内容编码为 UTF-8,但是您在控制台中也会遇到这个混乱......