about_Remote_Output

簡単な説明

リモート コマンドの出力を解釈および書式設定する方法について説明します。

長い説明

リモート コンピューターで実行されたコマンドの出力は、ローカル コンピューターで実行されるのと同じコマンドの出力のように見える場合がありますが、いくつかの大きな違いがあります。

このトピックでは、リモート コンピューターで実行されるコマンドの出力を解釈、書式設定、および表示する方法について説明します。

コンピューター名の表示

Invoke-Command コマンドレットを使用してリモート コンピューターでコマンドを実行すると、データを生成したコンピューターの名前を含む オブジェクトが返されます。 リモート コンピューター名は PSComputerName プロパティに格納されます。

多くのコマンドでは、PSComputerName が既定で表示されます。 たとえば、次のコマンドは、Server01 Get-Culture Server02 という 2 つのリモート コンピューターでコマンドを実行します。 次に示す出力には、コマンドが実行されたリモート コンピューターの名前が含まれます。

C:\PS> invoke-command -script {get-culture} -comp Server01, Server02

LCID  Name    DisplayName                PSComputerName
----  ----    -----------                --------------
1033  en-US   English (United States)    Server01
1033  es-AR   Spanish (Argentina)        Server02

PSComputerName プロパティを非表示にInvoke-Commandの HideComputerName パラメーターを使用できます。 このパラメーターは、1 つのリモート コンピューターからのみデータを収集するコマンド用に設計されています。

次のコマンドは、Server01 Get-Cultureコマンドを実行します。 HideComputerName パラメーターを使用して、PSComputerName プロパティと関連プロパティを非表示にしています。

C:\PS> invoke-command -scr {get-culture} -comp Server01 -HideComputerName

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)

PSComputerName プロパティが既定で表示されない場合は、表示できます。

たとえば、次のコマンドでは、Format-Table コマンドレットを使用して、リモート コマンドの出力に PSComputerName プロパティGet-Dateします。

$dates = invoke-command -script {get-date} -computername Server01, Server02
$dates | format-table DateTime, PSComputerName -auto

DateTime                            PSComputerName
--------                            --------------
Monday, July 21, 2008 7:16:58 PM    Server01
Monday, July 21, 2008 7:16:58 PM    Server02

MACHINENAME プロパティの表示

Get-Process、Get-Service、Get-EventLog などのいくつかのコマンドレットには、リモート コンピューター上のオブジェクトを取得する ComputerName パラメーターがあります。 これらのコマンドレットは PowerShell リモート処理を使用しないので、リモート処理用に構成されていないコンピューターでも使用Windows PowerShell。

これらのコマンドレットから返されるオブジェクトは、リモート コンピューターの名前を MachineName プロパティに格納します。 (これらのオブジェクトには PSComputerName プロパティが含まれています)。

たとえば、このコマンドは、Server01 および Server02 リモート コンピューター上の PowerShell プロセスを取得します。 既定の表示には、MachineName プロパティは含め "されません"。

C:\PS> get-process PowerShell -computername server01, server02

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
920      38    97524     114504   575     9.66   2648 PowerShell
194       6    24256      32384   142            3020 PowerShell
352      27    63472      63520   577     3.84   4796 PowerShell

Format-Table コマンドレットを使用して、プロセス オブジェクトの MachineName プロパティを表示できます。

たとえば、次のコマンドは、プロセスを $p 変数に保存し、パイプライン演算子 (|) を使用して $p 内のプロセスを Format-Table コマンドに送信します。 コマンドは、 の Property パラメーターを使用Format-Table MachineName プロパティをディスプレイに含める必要があります。

C:\PS> $p = get-process PowerShell -comp Server01, Server02
C:\PS> $P | format-table -property ID, ProcessName, MachineName -auto

Id ProcessName MachineName
-- ----------- -----------
2648 PowerShell  Server02
3020 PowerShell  Server01
4796 PowerShell  Server02

次のより複雑なコマンドは、MachineName プロパティを既定のプロセス表示に追加します。 ハッシュ テーブルを使用して計算プロパティを指定します。 幸いにも、それを使用するために理解する必要は" ではありません。

(バックティック ['] は継続文字です。

C:\PS> $p = get-process PowerShell -comp Server01, Server02

C:\PS> $p | format-table -property Handles, `
@{Label="NPM(K)";Expression={int}}, `
@{Label="PM(K)";Expression={int}}, `
@{Label="WS(K)";Expression={int}}, `
@{Label="VM(M)";Expression={int}}, `
@{Label="CPU(s)";Expression={if ($.CPU -ne $()){ $.CPU.ToString("N")}}}, `
Id, ProcessName, MachineName -auto

Handles NPM(K) PM(K)  WS(K) VM(M) CPU(s)   Id ProcessName MachineName
------- ------ -----  ----- ----- ------   -- ----------- -----------
920     38 97560 114532   576        2648 PowerShell  Server02
192      6 24132  32028   140        3020 PowerShell  Server01
438     26 48436  59132   565        4796 PowerShell  Server02

逆シリアル化されたオブジェクト

出力を生成するリモート コマンドを実行すると、コマンド出力がネットワーク経由でローカル コンピューターに送信されます。

ほとんどのライブ Microsoft .NET Frameworkオブジェクト (PowerShell コマンドレットから返されるオブジェクトなど) をネットワーク経由で送信できないので、ライブ オブジェクトは "シリアル化" されます。 つまり、ライブ オブジェクトは、 オブジェクトとそのプロパティの XML 表現に変換されます。 次に、XML ベースのシリアル化されたオブジェクトがネットワーク経由で送信されます。

ローカル コンピューターでは、PowerShell は XML ベースのシリアル化されたオブジェクトを受け取り、XML ベースのオブジェクトを標準の .NET Framework オブジェクトに変換することで、このオブジェクトを "逆シリアル化" します。

ただし、逆シリアル化されたオブジェクトはライブ オブジェクトではありません。 これは、シリアル化された時点のオブジェクトのスナップショットであり、プロパティは含まれますが、メソッドは含まれます。 これらのオブジェクトは、パイプラインへの渡し、選択したプロパティの表示、書式設定など、PowerShell で使用および管理できます。

ほとんどの逆シリアル化されたオブジェクトは、Types.ps1xml ファイルまたは Format.ps1xml ファイル内のエントリによって表示するために自動的に書式設定されます。 ただし、リモート コンピューターで生成された逆シリアル化されたオブジェクトのすべてについて、ローカル コンピューターにフォーマット ファイルが含されていない場合があります。 オブジェクトが書式設定されていない場合、各オブジェクトのすべてのプロパティがストリーミング リストのコンソールに表示されます。

オブジェクトが自動的に書式設定されない場合は、Format-Table や Format-List などの書式設定コマンドレットを使用して、選択したプロパティの書式設定と表示を行います。 または、Out-GridView コマンドレットを使用して、テーブルにオブジェクトを表示できます。

また、ローカル コンピューターにはないコマンドレットを使用するリモート コンピューターでコマンドを実行する場合、コンピューター上のこれらのオブジェクトの書式設定ファイルを持たないので、コマンドから返されるオブジェクトが正しく書式設定されていない可能性があります。 別のコンピューターから書式設定データを取得するには、Get-FormatDataコマンドレットExport-FormatDataします。

DirectoryInfo オブジェクトや GUID などの一部のオブジェクト型は、受信時にライブ オブジェクトに変換されます。 これらのオブジェクトは、特別な処理や書式設定を必要としません。

結果の順序付け

コマンドレットの ComputerName パラメーター内のコンピューター名の順序は、PowerShell がリモート コンピューターに接続する順序を決定します。 ただし、結果はローカル コンピューターが受信する順序で表示されます。これは別の順序である可能性があります。

結果の順序を変更するには、次のコマンドレットSort-Objectします。 PSComputerName プロパティまたは MachineName プロパティで並べ替えを行います。 オブジェクトの別のプロパティで並べ替え、異なるコンピューターの結果が相互に存在することもできます。

関連項目