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