2017-03-14 21 views
2

私はPowerShellでコマンドの出力を取得し、エンコードしてから再度デコードして、上記のコマンドの結果を受け取ろうとしています。UTF8エンコーディングのデータが変更されました。

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

net usersコマンドとは対照的に、しかし、結果は不正な形式の出てきます。私はエンコーディングをASCIIとUnicodeに変更しようとしましたが、結果は不正です。

どのようにフォーマットを維持するためのアイデアですか?

+0

どのように形式が違うのですか?あなたの質問を直接更新してください。 – mklement0

答えて

4

問題は、符号化によるものではありませんが、あなたは文字列にそれを強制しない限り、PowerShellは、コマンドの出力をマングルされますので:

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

あなたはところでInvoke-Expressionは必要ありません。これは、同様に動作します:

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

これはチャームのように機能しました。ありがとうございました :) –

0

Ansgar Wiechers' helpful answerを補完するために外部コマンドを呼び出す

は、文字列の配列として出力行を返します。あなたのケースでは

、配列は、その配列が、その場合にはPowerShellがスペース文字を使用して配列の要素を結合し、単一の文字列を余儀なくされたので、元の行の書式が失われました。例えば:

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

配管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 
関連する問題