about_Remote_Output
適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0
トピック
about_Remote_Output
概要
リモート コマンドの出力を解釈し、書式設定する方法について説明します。
詳細説明
リモート コンピューターで実行されたコマンドの出力は、ローカル コンピューターで実行された同じコマンドの出力と似ている場合がありますが、いくつかの重要な違いがあります。
このトピックでは、リモート コンピューターで実行されるコマンドの出力を解釈、書式設定、および表示する方法について説明します。
コンピューター名の表示
Invoke-Command コマンドレットを使用してリモート コンピューター上のコマンドを実行すると、データを生成したコンピューターの名前を含むオブジェクトが返されます。リモート コンピューター名は、PSComputerName プロパティに格納されます。
多くのコマンドで、既定では、PSComputerName が表示されます。たとえば、次のコマンドは、2 台のリモート コンピューター Server01 および Server02 で 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 コマンドの出力に追加します。
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 など、いくつかのオブジェクトの種類は、受信されるとライブ オブジェクトに変換されます。これらのオブジェクトには、特別な処理や書式設定は不要です。
結果の順序付け
コマンドレットの 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