次の方法で共有


リモート出力について

概要

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

詳細説明

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

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

コンピューター名の表示

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

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

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

Invoke-Command の HideComputerName パラメーターを使用すると、PSComputerName プロパティを非表示にすることができます。 このパラメーターは、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 パラメーターがあります。 これらのコマンドレットはWindows 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 変数に保存し、パイプライン演算子 (|) を使用して Format-Table コマンドに$pでプロセスを送信します。 コマンドは、Format-Table の Property パラメーターを使用して、表示に 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 オブジェクト (Windows PowerShell コマンドレットから返されるオブジェクトなど) はネットワーク経由で送信できないため、ライブ オブジェクトは "シリアル化" されます。 つまり、ライブ オブジェクトは、オブジェクトとそのプロパティの XML 表現に変換されます。 次に、XML ベースのシリアル化されたオブジェクトがネットワーク経由で送信されます。

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

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

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

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

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

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

結果の順序付け

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

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

関連項目

about_Remote

about_Remote_Variables

Format-Table

Get-EventLog

Get-Process

Get-Service

Get-WmiObject

Invoke-Command

Out-GridView

Select-Object