使用命令輸出

適用於:Exchange Server 2013

Exchange 管理命令介面提供數個方法,供您用來格式化命令輸出。 本主題討論下列主題:

  • 如何格式化資料 使用 Format-ListFormat-TableFormat-Wide Cmdlet,控制如何將所見到之資料格式化。

  • 如何輸出資料 使用 Out-HostOut-File Cmdlet,決定資料是要輸出至命令介面主控台視窗或檔案。 本主題包含將資料輸出至 Microsoft Internet Explorer 的範例腳本。

  • 如何篩選資料 使用下列任一篩選方法來篩選資料:

    • 特定 Cmdlet 上可用的伺服器端篩選。

    • 所有 Cmdlet 上均可使用的用戶端篩選,會將命令的結果以管線傳輸至 Where-Object Cmdlet。

若要使用本主題中所描述的功能,您必須先熟悉下列概念:

如何格式化資料

如果在管線尾端呼叫格式化 Cmdlet,便可覆寫預設的格式化,控制要顯示哪種資料及如何呈現該資料。 格式化 Cmdlet 分別是 Format-ListFormat-TableFormat-Wide 。 每一個 Cmdlet 都有不同於其他格式化 Cmdlet 的專屬輸出樣式。

Format-List

Format-List Cmdlet 可從管線取得輸入,然後輸出每一個物件之所有指定內容的垂直欄清單。 您可以使用 Property 參數來指定要顯示的屬性。 如果呼叫 Format-List Cmdlet 時未指定任何參數,則會輸出所有內容。 Format-List Cmdlet 會將文字換行而不會截斷它們。 Format-List Cmdlet 的最佳用途之一是覆寫 Cmdlet 的預設輸出,使您可以擷取其他或更重要的資訊。

例如,呼叫 Get-Mailbox Cmdlet 時,只會看到以表格格式呈現的少量資訊。 如果以管線將 Get-Mailbox Cmdlet 的輸出傳輸至 Format-List Cmdlet,並新增要檢視之其他或更重要資訊的參數,則您可以擷取想要的輸出。

您也可以指定萬用字元 "*",以代表部分的內容名稱。 如果包括萬用字元,則可比對多個內容,而不需個別輸入每一個內容名稱。 例如, 會 Get-Mailbox | Format-List -Property Email* 傳回開頭為 Email 的所有屬性。

下列範例會顯示可供您檢視 Get-Mailbox Cmdlet 所傳回之相同資料的不同方式。

Get-Mailbox TestUser1

Name                      Alias                ServerName       ProhibitSendQuota
----                      -----                ----------       ---------------
TestUser1                 TestUser1            mbx              unlimited

在第一個範例中,會呼叫不含特定格式的 Get-Mailbox Cmdlet,使預設輸出的格式為表格格式,並包含預定的內容集。

Get-Mailbox TestUser1 | Format-List -Property Name,Alias,EmailAddresses

Name           : TestUser1
Alias          : TestUser1
EmailAddresses : {SMTP:TestUser1@contoso.com}

在第二個範例中, Get-Mailbox Cmdlet 的輸出連同特定內容,會以管線傳輸至 Format-List Cmdlet。 誠如所見,此輸出的格式和內容大不相同。

Get-Mailbox TestUser1 | Format-List -Property Name, Alias, Email*
Name                      : Test User
Alias                     : TestUser1
EmailAddresses            : {SMTP:TestUser1@contoso.com}
EmailAddressPolicyEnabled : True

在最後一個範例中, Get-Mailbox Cmdlet 的輸出會以管線傳輸至 Format-List Cmdlet,如第二個範例所示。 不過,在最後一個範例中,會使用萬用字元來比對開頭為 Email 的所有屬性。

如果有多個物件傳遞至 Format-List Cmdlet,則物件的所有指定內容會按物件顯示並加以群組。 顯示順序視 Cmdlet 的預設參數而定。 預設參數最常是 Name 參數或 Identity 參數。 例如,呼叫 Get-Childitem Cmdlet 時,預設顯示順序是按英文字母順序排列的檔案名稱。 若要變更此行為,您必須呼叫 Format-List Cmdlet 以及 GroupBy 參數,以及您要將輸出分組的屬性值名稱。 例如,下列命令會列出目錄中的所有檔案,然後按副檔名將這些檔案加以群組。

Get-Childitem | Format-List Name,Length -GroupBy Extension

Extension: .xml

Name   : Config_01.xml
Length : 5627

Name   : Config_02.xml
Length : 3901

Extension: .bmp

Name   : Image_01.bmp
Length : 746550

Name   : Image_02.bmp
Length : 746550

Extension: .txt

Name   : Text_01.txt
Length : 16822

Name   : Text_02.txt
Length : 9835

在此範例中,Format-List Cmdlet 已依GroupBy參數所指定的Extension屬性將專案分組。 您可以在管線資料流中,使用含有物件之任何有效內容的 GroupBy 參數。

Format-Table

Format-Table Cmdlet 可讓您以含有標籤標題及內容資料欄的表格格式來顯示項目。 根據預設,許多 Cmdlet (如 Get-ProcessGet-Service Cmdlet) 都會針對輸出使用表格格式。 Format-Table Cmdlet 的參數包括PropertiesGroupBy參數。 這些參數的作用與 Format-List Cmdlet 的作用一模一樣。

Format-Table Cmdlet 也會使用Wrap參數。 此參數可讓冗長的內容資訊行全部顯示出來,而不會在行尾遭到截斷。 若要查看如何使用 Wrap 參數來顯示傳回的資訊,請在下列兩個範例中比較 Get-Command 命令 的輸出。

在第一個範例中,當 Get-Command Cmdlet 用來顯示 Get-Process Cmdlet 的命令資訊時,會截斷 Definition 屬性的資訊。

Get-Command Get-Process | Format-Table Name,Definition

Name                                    Definition
----                                    ----------
get-process                             get-process [[-ProcessName] String[]...

在第二個範例中, Wrap 參數會新增至 命令,以強制顯示 Definition 屬性的完整內容。

Get-Command Get-Process | Format-Table Name,Definition -Wrap

Get-Process                             Get-Process [[-Name] <String[]>] [-Comp
                                        uterName <String[]>] [-Module] [-FileVe
                                        rsionInfo] [-Verbose] [-Debug] [-ErrorA
                                        ction <ActionPreference>] [-WarningActi
                                        on <ActionPreference>] [-ErrorVariable
                                        <String>] [-WarningVariable <String>] [
                                        -OutVariable <String>] [-OutBuffer <Int
                                            32>]
                                        Get-Process -Id <Int32[]> [-ComputerNam
                                        e <String[]>] [-Module] [-FileVersionIn
                                        fo] [-Verbose] [-Debug] [-ErrorAction <
                                        ActionPreference>] [-WarningAction <Act
                                        ionPreference>] [-ErrorVariable <String
                                        >] [-WarningVariable <String>] [-OutVar
                                        iable <String>] [-OutBuffer <Int32>]
                                        Get-Process [-ComputerName <String[]>]
                                        [-Module] [-FileVersionInfo] -InputObje
                                        ct <Process[]> [-Verbose] [-Debug] [-Er
                                        rorAction <ActionPreference>] [-Warning
                                        Action <ActionPreference>] [-ErrorVaria
                                        ble <String>] [-WarningVariable <String
                                        >] [-OutVariable <String>] [-OutBuffer
                                        <Int32>]

如同 Format-List Cmdlet ,您也可以指定具有部分屬性名稱的萬用字元 「 * 」。 藉由包括萬用字元,您就可以比對多個內容,而不必個別輸入每一個內容名稱。

Format-Wide

Format-Wide Cmdlet 會提供比其他格式 Cmdlet 更簡易的輸出控制。 根據預設, Format-Wide Cmdlet 會嘗試盡可能地在一行輸出中顯示更多欄的內容值。 您可以藉由新增參數,來控制欄數及輸出空間的使用方式。

在最基本的用法中,呼叫不含任何參數的 Format-Wide Cmdlet,會儘量以頁面可容納的最多欄數來排列輸出。 例如,如果執行 Get-Childitem Cmdlet,並以管線將其輸出傳輸至 Format-Wide Cmdlet,您會看到下列的顯示資訊:

Get-ChildItem | Format-Wide

Directory: FileSystem::C:\WorkingFolder

Config_01.xml                           Config_02.xml
Config_03.xml                           Config_04.xml
Config_05.xml                           Config_06.xml
Config_07.xml                           Config_08.xml
Config_09.xml                           Image_01.bmp
Image_02.bmp                            Image_03.bmp
Image_04.bmp                            Image_05.bmp
Image_06.bmp                            Text_01.txt
Text_02.txt                             Text_03.txt
Text_04.txt                             Text_05.txt
Text_06.txt                             Text_07.txt
Text_08.txt                             Text_09.txt
Text_10.txt                             Text_11.txt
Text_12.txt

一般而言,呼叫不含任何參數的 Get-Childitem Cmdlet,會顯示內容表格中之目錄內所有檔案的名稱。 在這個範例中,以管線將 Get-Childitem Cmdlet 的輸出傳輸至 Format-Wide Cmdlet 之後,該輸出會以兩欄名稱顯示。 請注意,一次只能顯示一個內容類型,這是由 Format-Wide Cmdlet 後面的內容名稱所指定。 如果您新增 Autosize 參數,輸出會從兩個數據行變更為符合螢幕寬度的資料行數目。

Get-ChildItem | Format-Wide -AutoSize

Directory: FileSystem::C:\WorkingFolder

Config_01.xml   Config_02.xml   Config_03.xml   Config_04.xml   Config_05.xml
Config_06.xml   Config_07.xml   Config_08.xml   Config_09.xml   Image_01.bmp
Image_02.bmp    Image_03.bmp    Image_04.bmp    Image_05.bmp    Image_06.bmp
Text_01.txt     Text_02.txt     Text_03.txt     Text_04.txt     Text_05.txt
Text_06.txt     Text_07.txt     Text_08.txt     Text_09.txt     Text_10.txt
Text_11.txt     Text_12.txt

在這個範例中,表格會排列成五欄,而非兩欄。 Column 參數可讓您指定要顯示資訊的資料行數目上限,以提供更多控制權,如下所示:

Get-ChildItem | Format-Wide -Column 4

Directory: FileSystem::C:\WorkingFolder

Config_01.xml       Config_02.xml       Config_03.xml       Config_04.xml
Config_05.xml       Config_06.xml       Config_07.xml       Config_08.xml
Config_09.xml       Image_01.bmp        Image_02.bmp        Image_03.bmp
Image_04.bmp        Image_05.bmp        Image_06.bmp        Text_01.txt
Text_02.txt         Text_03.txt         Text_04.txt         Text_05.txt
Text_06.txt         Text_07.txt         Text_08.txt         Text_09.txt
Text_10.txt         Text_11.txt         Text_12.txt

在這個範例中,可使用 Column 參數,強迫欄數變成四個。

如何輸出資料

Out-Host 和 Out-File Cmdlet

Out-Host Cmdlet 是位於管線尾端、不會顯示的預設 Cmdlet。 在套用所有格式化之後, Out-Host Cmdlet 會將最後輸出傳送至主控台視窗,以進行顯示。 您不必明確地呼叫 Out-Host Cmdlet,因為它是預設輸出。 您可以呼叫 Out-File Cmdlet 做為命令的最後一個 Cmdlet,來置換將輸出傳送至主控台視窗的行為。 Out-File Cmdlet 則會接著將輸出寫至您在命令中指定的檔案,如下列範例所示:

Get-ChildItem | Format-Wide -Column 4 | Out-File c:\OutputFile.txt

在此範例中, Out-File Cmdlet 會將 Get-ChildItem | Format-Wide -Column 4 命令中顯示的資訊寫入名為 的 OutputFile.txt 檔案。 您也可以使用重新導向運算子,將管線輸出重新導向至檔案,這是右角括弧 ( > ) 。 若要將命令的管線輸出附加至現有檔案,而不取代原始檔案,請使用雙右角括弧 () >> ,如下列範例所示:

Get-ChildItem | Format-Wide -Column 4 >> C:\OutputFile.txt

在此範例中, Get-Childitem Cmdlet 的輸出會透過管道傳送至 Format-Wide Cmdlet 以進行格式化,然後寫入檔案結尾 OutputFile.txt 。 請注意,如果 OutputFile.txt 檔案不存在,使用雙右角括弧 ( >> ) 會建立檔案。

如需管線的詳細資訊,請 參閱 about_Pipelines

如需上述範例所用之語法的詳細資訊,請參閱Syntax

在 Internet Explorer 檢視資料

因為在 Exchange 管理命令介面中編寫指令碼容易又有彈性,您可以取得命令傳回的資料,並以數不盡的各種方式將其格式化及輸出。

下列範例會顯示如何使用簡易指令碼來輸出命令所傳回的資料,並將它顯示在 Internet Explorer 中。 這個指令碼會取得透過管線傳遞的物件、開啟 Internet Explorer 視窗,然後在 Internet Explorer 中顯示資料:

$Ie = New-Object -Com InternetExplorer.Application
$Ie.Navigate("about:blank")
While ($Ie.Busy) { Sleep 1 }
$Ie.Visible = $True
$Ie.Document.Write("$Input")
# If the previous line doesn't work on your system, uncomment the line below.
# $Ie.Document.IHtmlDocument2_Write("$Input")
$Ie

若要使用此腳本,請將它儲存至 C:\Program Files\Microsoft\Exchange Server\V15\Scripts 將執行腳本之電腦上的目錄。 將檔案 Out-Ie.ps1 命名為 。 儲存該檔案之後,您就可以使用該指令碼做為一般 Cmdlet。

注意事項

若要在 Exchange 2013 中執行指令碼,必須新增指令碼至未限定範圍的管理角色,且您必須直接獲派管理角色,或透過管理角色群組獲派管理角色。 如需詳細資訊,請 參閱瞭解管理角色

Out-Ie 本假設它收到的資料是有效的 HTML。 若要將您想檢視的資料轉換成 HTML,必須以管線將命令的結果傳輸至 ConvertTo-Html Cmdlet。 然後,您可以使用管線將該命令的結果傳送至 Out-Ie 腳本。 下列範例會顯示如何在 Internet Explorer 視窗中檢視目錄清單:

Get-ChildItem | Select Name,Length | ConvertTo-Html | Out-Ie

如何篩選資料

命令介面可讓您存取關於組織內的伺服器、信箱、Active Directory 及其他物件的大量資訊。 雖然存取此資訊有助於您進一步了解環境,但大量的資訊也很可能令您無法招架。 命令介面可讓您控制此資訊,並使用篩選來傳回您想看到的資料。 有下列幾種篩選類型可用:

  • 伺服器端篩選:伺服器端篩選會採用您在命令列上指定的篩選準則,並將它提交至您查詢的 Exchange 伺服器。 該伺服器會處理查詢,並只傳回符合您指定之篩選的資料。

    伺服器端篩選只能針對可傳回幾萬或幾十萬個結果的物件執行。 因此,只有收件者管理 Cmdlet (如 Get-Mailbox Cmdlet) 和佇列管理 Cmdlet (如 Get-Queue Cmdlet) 才支援伺服器端篩選。 這些 Cmdlet 支援 Filter 參數。 此參數會使用您指定的篩選運算式,並將它提交給伺服器處理。

  • 用戶端篩選:用戶端篩選是在您目前工作的本機主控台視窗中的物件上執行。 當您使用用戶端篩選時,Cmdlet 會擷取符合您在本機主控台視窗上執行之工作的所有物件。 然後,命令介面會取得所有傳回的結果、對那些結果套用用戶端篩選,並只傳回符合篩選的結果。 所有的 Cmdlet 都支援用戶端篩選。 這是以管線將命令的結果傳輸至 Where-Object Cmdlet 來呼叫。

伺服器端篩選

伺服器端篩選的實作是支援它之 Cmdlet 所特有的。 伺服器端篩選只可在傳回之物件的特定內容上加以啟用。 如需詳細資訊,請參閱下列 Cmdlet 的 [說明]:

         
Get-ActiveSyncDevice Get-ActiveSyncDeviceClass Get-CASMailbox Get-Contact Get-DistributionGroup
Get-DynamicDistributionGroup Get-Group Get-Mailbox Get-MailboxStatistics Get-MailContact
Get-MailPublicFolder Get-MailUser Get-Message Get-MobileDevice Get-Queue
Get-QueueDigest Get-Recipient Get-RemoteMailbox Get-RoleGroup Get-SecurityPrincipal
Get-StoreUsageStatistics Get-UMMailbox Get-User Get-UserPhoto Remove-Message
Resume-Message Resume-Queue Retry-Queue Suspend-Message Suspend-Queue

用戶端篩選

用戶端篩選可與任何 Cmdlet 一起使用。 這項功能包括同時支援伺服器端篩選的那些 Cmdlet。 如本主題稍早所述,用戶端篩選會接收管線中前一個命令傳回的所有資料,然後只傳回符合您指定之篩選器的結果。 Where-Object Cmdlet 會執行此篩選。 它可簡化為 Where

當資料透過管線傳遞時, Where Cmdlet 會從先前的物件接收資料,接著篩選資料,之後才會將它傳遞至下一個物件。 篩選是以 Where 命令所定義的指令碼區塊為基礎。 指令碼區塊會根據物件的內容和值來篩選資料。

Clear-Host Cmdlet 是用來清除主控台視窗。 在這個範例中,如果您執行下列命令,即可找到 Clear-Host Cmdlet 的所有已定義別名:

Get-Alias | Where {$_.Definition -eq "Clear-Host"}

CommandType     Name                            Definition
-----------     ----                            ----------
Alias           clear                           clear-host
Alias           cls                             clear-host

Get-Alias Cmdlet 會與 Where 命令一起運作,以傳回已對 Clear-Host Cmdlet 而非其他 Cmdlet 定義的別名清單。 下表概述此範例所使用之 Where 命令的每一個元素。

Where 命令的元素

元素 描述
{ } 以大括弧括住定義篩選器的指令碼區塊。
$_ 此特殊變數會自動起始及繫結到管線中的物件。
Definition 屬性 Definition 是目前管線物件的 屬性,該物件會儲存別名定義的名稱。 當 與 $_ 變數搭配使用時 Definition ,屬性名稱前面會出現句點。
-eq 這個「等於」比較運算子是用來指定其結果必須完全符合運算式中所提供的內容值。
Clear-Host 在這個範例中,"Clear-Host" 是命令剖析的值。

在這個範例中, Get-Alias Cmdlet 傳回的物件代表系統上所有已定義的別名。 即使您沒有在命令列上看到它們,也可收集別名,並透過管線傳遞至 Where Cmdlet。 Where Cmdlet 會使用指令碼區塊中的資訊,將篩選器套用至別名物件。

特殊變數 $ _represents要傳遞的物件。 變 $_ 量會由 Shell 自動起始,並系結至目前的管線物件。 如需此特殊變數的詳細資訊,請參閱 Shell 變數

使用標準 「dot」 標記法 (object.property) , Definition 則會新增 屬性來定義要評估之物件的確切屬性。 比較 -eq 運算子接著會比較這個屬性的值與 "Clear-Host" 。 只有具有符合此準則之 屬性的 Definition 物件會傳遞至主控台視窗以進行輸出。 如需比較運算子的詳細資訊,請參閱 比較運算子

Where 命令已篩選由 Get-Alias Cmdlet 傳回的物件之後,您可以將篩選物件以管線傳遞到另一個命令。 下一個命令僅處理由 Where 命令傳回的篩選物件。