檢閱 Windows PowerShell 管線及其輸出

已完成

PowerShell 可以在管線中執行命令,其為一或多個命令的鏈結,其中來自一個命令的輸出可以當做輸入傳遞至下一個命令。 在 Windows PowerShell 中,管線中的每個命令會依序從左至右執行。 對於多個命令,每個命令及其參數都會以稱為管道 (|) 的字元分隔下一個命令。 特定規則會指示如何將輸出從一個命令傳遞至下一個命令。 您將在此課程模組中瞭解這些規則。

當您在主控台主機應用程式中與 Windows PowerShell 互動時,您應該將每個命令列視為單一管線。 您可以輸入命令或一系列命令,然後按 Enter 鍵以執行管線。 管線中最後一個命令的輸出會顯示在螢幕上。 另一個殼層提示會遵循該輸出,您可以在該殼層提示將命令輸入新的管線。

注意

您可以在主控台中的多個實體行上輸入一個邏輯命令列。 例如,輸入 Get-Service,然後按 Enter 鍵。 Windows PowerShell 進入延伸提示模式,此由兩個連續大於符號 (>>) 的出現來表示。 這可讓您完成命令列。 選取 Ctrl+C 以結束命令,並返回 Windows PowerShell 提示。

先前,您已瞭解與 Windows PowerShell 命令相關聯的常見動作或動詞。 當在單一管線中執行多個命令時,您最常注意到結合使用 GetSet 的動詞。 您可以使用 Get-* 命令的輸出做為 Set-* 命令的輸入。 您通常會將這些命令與篩選命令搭配使用,例如 WhereSelect。 在此案例下,會先依 WhereSelect 命令對 Get-* 的輸出進行篩選,再透過管道將該輸出傳送至 Set-* 命令。

注意

Where 命令是 Where-Object 的別名,而 Select 命令是 Select-Object 的別名。 第 3 課「篩選管線外的物件」會更詳細地說明篩選。

其可藉由比較 PowerShell 物件和管線與真實世界項目來協助瞭解這些物件和管線的概念。 例如,如果我們將汽車視為物件,我們就可以描述汽車的屬性,例如引擎、汽車色彩、汽車大小、類型、製造商和型號。 在 PowerShell 中,這些稱為屬性。 物件的屬性可以是物件本身。 例如,引擎屬性也是具有屬性的物件,例如活塞、火星塞、曲軸等。

物件具有動作,對應至開啟或關閉門、變更齒輪、加速和踩煞車等活動。 在 PowerShell 中,這些動作稱為方法。

管線可讓我們取得一個命令所產生的輸出,並將該物件傳遞至另一個命令的輸入。 為了讓您更容易瞭解這個概念,我們可以將命令連結到處理站,其中每個處理站都會接收材料,並將其轉換成其他項目。

管線輸出

PowerShell 命令不會產生文字做為輸出。 相反地,其會產生物件。 物件是描述記憶體內部資料結構的泛型字組。

您可以將命令輸出想像成類似資料庫資料表或試算表的內容。 在 PowerShell 術語中,資料表或試算表是由物件的集合所組成,或簡稱集合。 每個資料列都是單一物件,而每個資料行都是該物件的屬性,也就是物件的相關資訊。 例如,當您執行 Get-Service 命令時,其會傳回服務物件的集合。 每個物件都有具有名稱的屬性,例如 NameDisplayNameStatus

使用物件時,PowerShell 與其他命令列殼層不同,其中命令主要會產生文字。 在以文字為基礎的殼層中,假設您想要取得所有已啟動的服務清單。 您可以執行命令來產生服務的文字清單,每個服務都有不同的資料列。 每個資料列可能包含服務的名稱和服務的某些屬性,每個屬性會以逗號或其他字元分隔。 若要擷取特定屬性值,您必須將該文字輸出傳送至另一個命令,另一個命令會處理文字以提取您需要的特定值。 系統會建立該命令,以瞭解第一個命令所建立的特定文字格式。 如果第一個命令的輸出有所變更,且狀態資訊發生移動,您必須編輯第二個命令以取得新的位置資訊。 以文字為基礎的殼層需要大量的文字剖析技能。 這讓 Perl 等指令碼語言變得很受歡迎,因為其提供強式文字剖析和文字操作功能。

在 PowerShell 中,您會指示 Cmdlet 產生服務物件的集合,然後只顯示 Name 屬性。 記憶體中物件的結構可讓 PowerShell 為您尋找資訊。 如此一來,您就不需要擔心命令輸出的確切形式。

這項功能可讓 Get | Set 模式正常運作。 Get-* 命令的輸出是物件,因此 PowerShell 可以尋找 Set-* 命令所需的屬性,讓命令能運作,而不需要您明確指定這些屬性。