我正在尝试在PowerShell中获取命令的输出并对其进行编码,然后再次对其进行解码以接收所示命令的结果,如图所示。
$enc = [system.Text.Encoding]::UTF8
$bytes = $enc.GetBytes((Invoke-Expression "net users"))
$enc.GetString($bytes)
但是,与原始net users
命令相反,结果出现了格式错误。我已经尝试将编码更改为ASCII和Unicode,结果仍然是格式错误。
有关如何维护格式的任何想法?
答案 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