UTF8编码更改数据格式

时间:2017-03-14 11:43:12

标签: powershell encoding utf-8

我正在尝试在PowerShell中获取命令的输出并对其进行编码,然后再次对其进行解码以接收所示命令的结果,如图所示。

$enc = [system.Text.Encoding]::UTF8
$bytes = $enc.GetBytes((Invoke-Expression "net users"))
$enc.GetString($bytes)

但是,与原始net users命令相反,结果出现了格式错误。我已经尝试将编码更改为ASCII和Unicode,结果仍然是格式错误。

有关如何维护格式的任何想法?

2 个答案:

答案 0 :(得分:4)

问题不是由编码引起的,但是因为PowerShell会破坏命令输出,除非你强制它成为字符串:

$bytes = $enc.GetBytes((Invoke-Expression "net users" | Out-String))

您不需要Invoke-Expression BTW。这也可以:

$bytes = $enc.GetBytes((net users | Out-String))

答案 1 :(得分:0)

补充Ansgar Wiechers' helpful answer

调用外部命令会将输出行作为字符串的数组返回。

在您的情况下,数组被强制插入字符串,在这种情况下,PowerShell使用 space 字符连接数组元素,因此原始行格式为丢失; e.g:

> [string] 1, 2, 3
1 2 3   # single string containing the array elements joined with spaces

如同Ansgar的回答一样,管道到Out-String会阻止创建数组并将外部命令输出作为字符串返回。

> (1, 2, 3 | Out-String | Measure-Object).Count
1          # Out-String output a single string

另一种选择是根据需要将数组元素与换行符连接起来(您不会在控制台中看到差异,但是您可以使用这种技术获得单个多行输出字符串:

> (net users) -join "`n"            # or, more robustly: [environment]::NewLine

您可以通过设置[Console]::OutputEncoding (暂时)告诉PowerShell外部命令可以获得的编码:

但是,只有当您知道使用非默认输出编码的外部实用程序(系统的活动OEM代码页)时,才需要这样做 - 我怀疑net users是否需要这样做;那说,这是怎么回事:

$prevEnc = [Console]::OutputEncoding 
[Console]::OutputEncoding = New-Object System.Text.UTF8Encoding
$str = net users | Out-String  # `net users` output is now properly decoded as UTF-8
[Console]::OutputEncoding = $prevEnc