主題
    about_Remote_Output

簡短描述
    說明如何解譯及格式化遠端命令的輸出。

完整描述
    相同命令在遠端電腦與本機電腦執行的輸出類似,但是仍有幾個顯著的差異。

    本主題說明如何解譯、格式化及顯示在遠端電腦執行之命令的輸出。

                    
 顯示電腦名稱

    使用 Invoke-Command Cmdlet 在遠端電腦執行命令時,該命令會傳回物件,其中包含
    產生資料的電腦名稱。這個遠端電腦名稱會儲存在 PSComputerName 屬性中。

    許多命令預設都會顯示 PSComputerName。例如,下列命令會在 Server01 和 
    Server02 兩部遠端電腦執行 Get-Culture 命令。其輸出 (顯示在下方) 包括執行命
    令的遠端電腦名稱。

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

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

    
    您可以使用 Invoke-Command 的 HideComputerName 參數來隱藏 PSComputerName 
    屬性。這個參數是專為只從一部遠端電腦收集資料的命令而設計。

    下列命令會在 Server01 遠端電腦執行 Get-Culture 命令,並使用 
    HideComputerName 參數來隱藏 PSComputerName 屬性和相關屬性。


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

        LCID             名稱             DisplayName
        ----             ----             -----------
        1033             en-US            English (United States)



     如果依預設未顯示 PSComputerName 屬性,您也可以顯示它。

     例如,下列命令會使用 Format-Table Cmdlet,將 PSComputerName 屬性新增至遠
     端 Get-Date 命令的輸出。

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

        DateTime                                 PSComputerName
        --------                                 --------------
        2008 年 7 月 21 日星期一下午 07:15:58    Server01
        2008 年 7 月 21 日星期一下午 07:15:58    Server02      


 顯示 MACHINENAME 屬性

    有幾個 Cmdlet (包括 Get-Process、Get-Service 和 Get-EventLog) 具有 
    ComputerName 參數,可用來取得遠端電腦上的物件。這些 Cmdlet 並未使用
    Windows PowerShell 遠端功能,因此即使是在未設定 Windows PowerShell 
    遠端功能的電腦上,您都可以使用這些 Cmdlet。

    這些 Cmdlet 傳回的物件會將遠端電腦的名稱儲存在 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 Cmdlet 來顯示處理序物件的 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 
    Cmdlet 傳回的物件) 都不能透過網路傳輸,因此這些即時物件都會「序列化」。換
    句話說,也就是即時物件都會轉換成物件及其屬性的 XML 表示,然後再透過網路來
    傳輸這些 XML 序列化物件。

    在本機電腦,Windows PowerShell 會接收 XML 序列化物件,並透過將 XML 物件轉換
    成標準 .NET Framework 物件的方式,將該物件「還原序列化」。

    不過,還原序列化後的物件並不是即時物件。它是物件在序列化當時的快照,而且其
    中只包含屬性而不包含方法。您可以在 Windows PowerShell 中使用及管理這些物件,
    包括在管線中傳遞物件、顯示選取的屬性,以及格式化物件等。

    大部分的還原序列化物件都會依 Types.ps1xml 或 Format.ps1xml 中的項目,自動設
    定顯示格式。不過,本機電腦可能沒有格式檔案可供遠端電腦產生的所有還原序列化
    物件使用。尚未格式化物件時,各個物件的所有屬性都會出現在主控台的串流清單中。

    如果物件沒有自動格式化,您可以使用格式化 Cmdlet (例如 Format-Table 或 
    Format-List),格式化並顯示所選取的屬性。或者,您也可以使用 Out-GridView 
    Cmdlet 以表格來顯示物件。

    此外,如果您在遠端電腦執行命令,而這個命令使用本機電腦所沒有的 Cmdlet,則
    該命令傳回的物件可能會出現格式錯誤,因為本機電腦並沒有格式檔案可供這些物
    件使用。若要從其他電腦取得格式化資料,請使用 Get-FormatData 和 
    Export-FormatData Cmdlet。

    有些物件類型 (例如 DirectoryInfo 物件和 GUID) 會在接收完成時轉換回即時物
    件。
    這些物件並不需經過任何特別處理或格式化。 



 排序結果
    Cmdlet 之 ComputerName 參數中電腦名稱的順序將決定 Windows PowerShell 連
    線到遠端電腦的順序。不過,結果則會依照本機電腦的接收順序顯示,而可能有不同
    的順序。

    若要變更結果的順序,請使用 Sort-Object Cmdlet。您可以依據 PSComputerName 
    或 MachineName 屬性來排序,也可以依據物件的其他屬性來排序,以分散排列不同電
    腦所傳回的結果。



請參閱
    about_Remote
    Format-Table
    Get-EventLog
    Get-Process
    Get-Service
    Get-WmiObject
    Invoke-Command
    Format-Table
    Select-Object




目錄