about_Remote_Output

Krótki opis

Opisuje sposób interpretowania i formatowania danych wyjściowych poleceń zdalnych.

Długi opis

Dane wyjściowe polecenia uruchomionego na komputerze zdalnym mogą wyglądać jak dane wyjściowe tego samego polecenia uruchomionego na komputerze lokalnym, ale istnieją pewne istotne różnice.

W tym temacie wyjaśniono, jak interpretować, formatować i wyświetlać dane wyjściowe poleceń uruchamianych na komputerach zdalnych.

WYŚWIETLANIE NAZWY KOMPUTERA

Gdy używasz polecenia cmdlet Invoke-Command do uruchomienia polecenia na komputerze zdalnym, polecenie zwraca obiekt, który zawiera nazwę komputera, który wygenerował dane. Nazwa komputera zdalnego jest przechowywana we właściwości PSComputerName.

W przypadku wielu poleceń parametr PSComputerName jest wyświetlany domyślnie. Na przykład następujące polecenie uruchamia polecenie Get-Culture na dwóch komputerach zdalnych, Server01 i Server02. Dane wyjściowe, które są wyświetlane poniżej, zawiera nazwy komputerów zdalnych, na których uruchomiono polecenie.

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

Można użyć HideComputerName parametru Invoke-Command aby ukryć właściwość PSComputerName. Ten parametr jest przeznaczony dla poleceń, które zbierają dane tylko z jednego komputera zdalnego.

Następujące polecenie uruchamia polecenie Get-Culture na komputerze zdalnym Server01. Używa parametru HideComputerName, aby ukryć właściwość PSComputerName i powiązane właściwości.

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

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)

Można również wyświetlić właściwość PSComputerName, jeśli nie jest wyświetlana domyślnie.

Na przykład następujące polecenia używają polecenia cmdlet Format-Table, aby dodać właściwość PSComputerName do danych wyjściowych polecenia Get-Date polecenia.

$dates = invoke-command -script {get-date} -computername Server01, Server02
$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

WYŚWIETLANIE WŁAŚCIWOŚCI MACHINENAME

Kilka polecenia cmdlet, w tym Get-Process, Get-Service i Get-EventLog, ma ComputerName parametru, który pobiera obiekty na komputerze zdalnym. Te polecenia cmdlet nie używają komunikacji zdalnej programu PowerShell, więc można ich używać nawet na komputerach, które nie są skonfigurowane do komunikacji zdalnej w Windows PowerShell.

Obiekty zwracane przez te polecenia cmdlet przechowują nazwę komputera zdalnego we właściwości MachineName. (Te obiekty nie mają właściwości PSComputerName).

Na przykład to polecenie pobiera proces programu PowerShell na komputerach zdalnych Server01 i Server02. Domyślny ekran nie zawiera właściwości 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

Możesz użyć polecenia cmdlet Format-Table, aby wyświetlić właściwość MachineName obiektów procesu.

Na przykład następujące polecenie zapisuje procesy w zmiennej $p, a następnie używa operatora potoku (|) do wysyłania procesów w $p do Format-Table polecenia. Polecenie używa parametru Property Format-Table, aby uwzględnić właściwość MachineName na ekranie.

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

Następujące bardziej złożone polecenie dodaje właściwość MachineName do domyślnego wyświetlania procesu. Używa ona tabel skrótów do określania właściwości obliczeniowych. Na szczęście nie musisz go rozumieć, aby z niego korzystać.

(Należy pamiętać, że znak kontynuacji ['] jest znakiem kontynuacji).

C:\PS> $p = get-process PowerShell -comp Server01, Server02

C:\PS> $p | format-table -property Handles, `
@{Label="NPM(K)";Expression={int}}, `
@{Label="PM(K)";Expression={int}}, `
@{Label="WS(K)";Expression={int}}, `
@{Label="VM(M)";Expression={int}}, `
@{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

OBIEKTY DESERIALIZOWANE

Po uruchomieniu poleceń zdalnych, które generują dane wyjściowe, dane wyjściowe polecenia są przesyłane przez sieć z powrotem do komputera lokalnego.

Ponieważ większość obiektów .NET Framework Microsoft (takich jak obiekty zwracane przez polecenia cmdlet programu PowerShell) nie może być przesyłana za pośrednictwem sieci, obiekty na żywo są "serializowane". Innymi słowy, obiekty na żywo są konwertowane na reprezentacje XML obiektu i jego właściwości. Następnie serializowany obiekt oparty na języku XML jest przesyłany przez sieć.

Na komputerze lokalnym program PowerShell odbiera obiekt serializowany w formacie XML i "deserializuje" go przez przekonwertowanie obiektu opartego na języku XML na standardowy .NET Framework obiekt.

Jednak deserializowany obiekt nie jest obiektem na żywo. Jest to migawka obiektu w czasie serializacji i zawiera właściwości, ale nie metody. Tych obiektów można używać i zarządzać nimi w programie PowerShell, w tym przekazywaniem ich w potokach, wyświetlaniem wybranych właściwości i ich formatowaniem.

Większość deserializowanych obiektów jest automatycznie formatowana do wyświetlania przez wpisy w plikach Types.ps1xml lub Format.ps1xml. Jednak komputer lokalny może nie mieć plików formatowania dla wszystkich deserializowanych obiektów, które zostały wygenerowane na komputerze zdalnym. Gdy obiekty nie są sformatowane, wszystkie właściwości każdego obiektu są wyświetlane w konsoli na liście przesyłania strumieniowego.

Gdy obiekty nie są formatowane automatycznie, można użyć formatowania polecenia cmdlet, takie jak Format-Table lub Format-List, aby sformatować i wyświetlić wybrane właściwości. Możesz też użyć polecenia cmdlet Out-GridView, aby wyświetlić obiekty w tabeli.

Ponadto w przypadku uruchomienia polecenia na komputerze zdalnym, który używa poleceń cmdlet, których nie ma na komputerze lokalnym, obiekty zwracane przez polecenie mogą nie być prawidłowo sformatowane, ponieważ nie masz plików formatowania dla tych obiektów na komputerze. Aby uzyskać dane formatowania z innego komputera, użyj Get-FormatData i Export-FormatData cmdlet.

Niektóre typy obiektów, takie jak obiekty DirectoryInfo i identyfikatory GUID, są konwertowane z powrotem na obiekty na żywo po ich otrzymaniu. Te obiekty nie wymagają specjalnej obsługi ani formatowania.

KOLEJNOŚĆ WYNIKÓW

Kolejność nazw komputerów w parametrze ComputerName poleceń cmdlet określa kolejność, w jakiej program PowerShell łączy się z komputerami zdalnymi. Jednak wyniki są wyświetlane w kolejności, w której komputer lokalny je odbiera, co może być w innej kolejności.

Aby zmienić kolejność wyników, użyj Sort-Object cmdlet . Możesz sortować według właściwości PSComputerName lub MachineName. Można również sortować według innej właściwości obiektu, aby wyniki z różnych komputerów były przeplatone.

Zobacz też