比較遠端輸出與本機輸出
當您在本機電腦上執行 Get-Process 之類的命令時,命令會傳回 System.Diagnostics.Process 類型的一或多個物件,並將物件新增至 Windows PowerShell 管線。 這些物件具有屬性、方法和經常發生的事件。 方法可讓您執行工作。 例如,Process 物件的 Kill() 方法會終止這個物件所代表的程序。
注意
將物件轉換成易於傳輸的形式,此程序稱為序列化。 序列化會取得物件狀態並將轉換成序列資料格式,例如 XML 或二進位格式。 還原序列化會將格式化 XML 或二進位資料轉換成物件類型。
當命令在遠端電腦上執行時,該電腦會將結果序列化為 XML,並將該 XML 文字傳送至您的電腦。 這樣做可以將物件資訊轉換成可透過網路傳輸的格式。 不過,對於複雜的物件,序列化程序只能使用物件的相關靜態資訊,換句話說,其屬性。
當電腦收到 XML 時,即會還原序列化,將物件轉換成加入 Windows PowerShell 管線中的形式。 當您有 Process 物件時,透過管線將其傳送至 Get-Member 後,您會了解該物件現在屬於 Deserialized.System.Diagnostics.Process 類型,是一種相關但不同類型的物件。 已還原序列化的物件沒有任何方法和事件。
有鑑於序列化和還原序列化是 PowerShell 遠端執行的一部分,您應將以此方式取得的任何物件視為靜態快照集。 物件屬性的值無法更新,而且物件無法用來執行任何動作。 因此,任何需要與遠端物件互動的工作都應在遠端電腦上的 PowerShell 遠端工作階段期間執行。
例如,以下是不會產生所需結果的命令範例:
Invoke-Command –Computer LON-DC1 –ScriptBlock { Get-Process –Name Note* } |
Stop-Process
在此範例中,您正在擷取 Process 物件,但停止程序的工作是在本機電腦上進行,而不是遠端電腦。 這會導致名稱剛好與遠端程序相符的任何本機程序停止執行。
完成預期結果的適當方式是執行:
Invoke-Command –Computer LON-DC1 –ScriptBlock { Get-Process –Name Note* |
Stop-Process }
在此情況下,處理程序完全是在遠端電腦上發生,只有最終結果會序列化並回傳。 這兩個命令之間的差異很細微,但請務必了解。