ARGOMENTO
about_Remote_Output
DESCRIZIONE BREVE
Descrive come interpretare e formattare l'output dei comandi remoti.
DESCRIZIONE DETTAGLIATA
L'output di un comando eseguito in un computer remoto è simile
all'output dello stesso comando eseguito in un computer locale,
ma vi sono alcune differenze significative.
In questo argomento viene illustrato come interpretare,
formattare e visualizzare l'output di comandi che eseguiti in
computer remoti.
VISUALIZZAZIONE DEL NOME DEL COMPUTER
Quando si utilizza il cmdlet Invoke-Command per eseguire un
comando in un computer remoto, il comando restituisce un oggetto
che include il nome del computer che ha generato i dati. Il nome
del computer remoto viene archiviato nella proprietà PSComputerName.
Per molti comandi, viene visualizzato PSComputerName per
impostazione predefinita. Il comando seguente, ad esempio, esegue
un comando Get-Culture su due computer remoti, Server01 e
Server02. L'output riportato di seguito include i nomi dei
computer remoti in cui il comando è stato eseguito.
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
È possibile utilizzare il parametro HideComputerName di
Invoke-Command per nascondere la proprietà PSComputerName. Questo
parametro è progettato per i comandi che raccolgono dati da un
solo computer remoto.
Il comando seguente esegue un comando Get-Culture nel computer
remoto Server01. Utilizza il parametro HideComputerName per
nascondere la proprietà PSComputerName e le proprietà correlate.
C:\PS> invoke-command -scr {get-culture} -comp Server01 -HideComputerName
LCID Name DisplayName
---- ---- -----------
1033 en-US English (United States)
È anche possibile visualizzare la proprietà PSComputerName, se
non visualizzata per impostazione predefinita.
I comandi seguenti, ad esempio, utilizzano il cmdlet
Format-Table per aggiungere la proprietà PSComputerName
all'output di un comando Get-Date remoto.
C:\PS> $dates = invoke-command -script {get-date} -computername Server01, Server02
C:\PS> $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
VISUALIZZAZIONE DELLA PROPRIETÀ MACHINENAME
Diversi cmdlet, tra cui Get-Process, Get-Service e Get-EventLog,
dispongono di un parametro ComputerName che ottiene gli oggetti
in un computer remoto.
Questi cmdlet non utilizzano la comunicazione remota di Windows
PowerShell, ed è pertanto possibile utilizzarli anche in
computer non configurati per la comunicazione remota in Windows
PowerShell.
Gli oggetti restituiti da questi cmdlet archiviano il nome del
computer remoto nella proprietà MachineName (questi oggetti non
dispongono di una proprietà PSComputerName).
Questo comando, ad esempio, ottiene il processo di PowerShell nei
computer remoti Server01 e Server02. La visualizzazione
predefinita non include la proprietà 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
È possibile utilizzare il cmdlet Format-Table per visualizzare la
proprietà MachineName degli oggetti processo.
Il comando seguente, ad esempio, salva i processi nella variabile
$p e quindi utilizza un operatore pipeline (|) per inviare i
processi in $p al comando Format-Table. Il comando utilizza il
parametro Property di Format-Table per includere la proprietà
MachineName nella visualizzazione.
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
Il comando più complesso seguente aggiunge la proprietà
MachineName alla visualizzazione del processo predefinita.
Utilizza tabelle hash per specificare le proprietà calcolate.
Fortunatamente, non è necessario comprenderlo per utilizzarlo.
Notare che il carattere apice inverso [`] è il carattere di
continuazione.
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
OGGETTI DESERIALIZZATI
Quando si eseguono comandi remoti che generano output, l'output
del comando viene ritrasmesso attraverso la rete al computer locale.
Poiché la maggior parte degli oggetti live Microsoft .NET
Framework attivi (ad esempio gli oggetti restituiti dai cmdlet di
Windows PowerShell) non possono essere trasmessi tramite la rete,
gli oggetti attivi sono "serializzati". In altre parole, gli
oggetti attivi sono convertiti in rappresentazioni XML
dell'oggetto e delle relative proprietà. Quindi, l'oggetto
serializzato basato su XML viene trasmesso tramite la rete.
Nel computer locale, Windows PowerShell riceve l'oggetto
serializzato basato su XML e lo "deserializza" convertendo
l'oggetto basato su XML in un oggetto .NET Framework standard.
Tuttavia, l'oggetto deserializzato non è un oggetto attivo. È uno
snapshot dell'oggetto al momento in cui viene serializzato e
include proprietà ma non metodi. È possibile utilizzare e gestire
questi oggetti in Windows PowerShell, passarli nelle pipeline,
visualizzare le proprietà selezionate e formattandoli.
La maggior parte gli oggetti deserializzati sono automaticamente
formattati per la visualizzazione per voci nei file Types.ps1xml
o Format.ps1xml. Tuttavia, il computer locale potrebbe non
disporre di file di formattazione per tutti gli oggetti
deserializzati generati in un computer remoto. Quando gli oggetti
non sono formattati, tutte le proprietà di ogni oggetto vengono
visualizzate nella console in un elenco di flusso.
Quando gli oggetti non sono formattati automaticamente, è
possibile utilizzare i cmdlet di formattazione, ad esempio
Format-Table o Format-List, per formattare e visualizzare le
proprietà selezionate. In alternativa è possibile utilizzare il
cmdlet Out-GridView per visualizzare gli oggetti in una tabella.
Inoltre, se si esegue un comando in un computer remoto che
utilizza cmdlet non presenti nel computer locale, gli oggetti
restituiti dal comando potrebbero non essere formattati
correttamente poiché non si dispone dei file di formattazione per
tali oggetti nel computer. Per ottenere i dati di formattazione
da un altro computer, utilizzare i cmdlet Get-FormatData e
Export-FormatData.
Alcuni tipi di oggetto, ad esempio gli oggetti DirectoryInfo e i
GUID, vengono convertiti nuovamente in oggetti attivi quando
vengono ricevuti. Per tali oggetti non è necessaria alcuna
operazione speciale di gestione o formattazione.
ORDINAMENTO DEI RISULTATI
L'ordine dei nomi dei computer nel parametro ComputerName dei
cmdlet determina l'ordine nel quale Windows PowerShell si
connette ai computer remoti. Tuttavia, i risultati vengono
visualizzati nell'ordine in cui il computer locale li riceve che
potrebbe essere un ordine diverso.
Per modificare l'ordine dei risultati, utilizza il cmdlet
Sort-Object. È possibile effettuare l'ordinamento in base alla
proprietà PSComputerName o MachineName. È anche possibile
effettuare l'ordinamento in base a un'altra proprietà
dell'oggetto, in modo che i risultati dei computer diversi siano
mischiati.
VEDERE ANCHE
about_Remote
Format-Table
Get-EventLog
Get-Process
Get-Service
Get-WmiObject
Invoke-Command
Out-GridView
Select-Object