about_remote_output
トピック
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
-------- --------------
2008 年 7 月 21 日 7:16:58 Server01
2008 年 7 月 21 日 7:16:58 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