トピック about_Remote_Output 簡易説明 リモート コマンドの出力を解釈および書式設定する方法について説明します。 詳細説明 リモート コンピューター上で実行されたコマンドの出力はローカル コンピューターで実行された 同じコマンドの出力と同じように見えますが、いくつかの大きな違いがあります。 このトピックでは、リモート コンピューター上で実行されたコマンドの出力を解釈、書式設定、お よび表示する方法について説明します。 コンピューター名の表示 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 台のリモート コンピューターからのみデ ータを収集するコマンド向けに設計されています。 次のコマンドは、Get-Culture コマンドを Server01 リモート コンピューター上で実行します。こ こでは、HideComputerName パラメーターを使用して、PSComputerName プロパティおよび関連プロ パティを非表示にしています。 C:\PS> invoke-command -scr {get-culture} -comp Server01 -HideComputerName LCID Name DisplayName ---- ---- ----------- 1033 en-US English (United States) PSComputerName プロパティは、既定で表示されない場合でも、表示することができます。 たとえば、次のコマンドは、Format-Table コマンドレットを使用して、リモート Get-Date コマンドの出力に PSComputerName プロパティを追加します。 C:\PS> $dates = invoke-command -script {get-date} -computername Server01, Server02 C:\PS> $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 変数に格納した後、パイプライン演算子 (|) を使用して $p 内のプロセスを Format-Table コマンドに渡します。次のコマンドは、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]($_.NPM/1024)}}, ` @{Label="PM(K)";Expression={[int]($_.PM/1024)}}, ` @{Label="WS(K)";Expression={[int]($_.WS/1024)}}, ` @{Label="VM(M)";Expression={[int]($_.VM/1MB)}}, ` @{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 など) は、受信時に元のライブ オブ ジェクトに変換されます。これらのオブジェクトに対しては、特別な処理や書式設定は必要ありま せん。 結果の並べ替え Windows PowerShell がリモート コンピューターに接続する順序は、コマンドレットの ComputerName パラメーターに含まれるコンピューター名の順序によって決まります。ただし、結果 は、ローカル コンピューターが結果を受け取った順に表示されるので、順序が変わることがありま す。 結果の順序を変更するには、Sort-Object コマンドレットを使用します。PSComputerName プロ パティまたは MachineName プロパティに基づいて並べ替えを行うことができます。また、オブジェ クトの他のプロパティに基づいて並べ替えを行うこともできます。その場合、結果はコンピュータ ーごとの表示にはなりません。 関連項目 about_Remote Format-Table Get-EventLog Get-Process Get-Service Get-WmiObject Invoke-Command Out-GridView Select-Object