2016-04-01 20 views
3

Ich habe ein Skript, das mehrere Jobs erstellt und zwei einfache Werte in den Jobs speichert.Wie kann ich Ausgabe von Format-Tabelle für die spätere Verwendung speichern

Start-Job -ScriptBlock {param ([string]$compip) tnc $compip | select RemoteAddress,PingSucceeded -WarningAction SilentlyContinue} -ArgumentList $compip 

Das funktioniert gut. Was ich gerne wissen würde ist, wie kann ich den folgenden Code in einer Variablen speichern?

Get-Job | Receive-Job | sort RemoteAddress | FT 

Ich habe dies versucht, aber es funktioniert nicht wie ich dachte, es würde:

$pcs = Get-Job | Receive-Job | sort RemoteAddress | FT 
$pcs.RemoteAddress 

Bin ich auf diese gehen in die falsche Richtung? Ich möchte die Daten aus dem obigen Befehl get-job speichern, um die Werte später im Skript zu verwenden. Ich nahm an, es würde funktionieren, weil die Ausgabe korrekt aussieht: Befehl:

Get-Job | Receive-Job | sort RemoteAddress | FT 

Ausgang:

RemoteAddress PingSucceeded       
------------- -------------       
192.168.0.163   True 
192.168.0.101   False 
192.168.0.2   False 
192.168.0.251   True 
+1

einfach fallen lassen die 'FT'. Die Format-Tabelle dient nicht zum Speichern von Daten. Nur auf der Konsole anzeigen. Die Format-Cmdlets zerlegen das Objekt, sodass Sie es nicht mehr so ​​verwenden können, wie Sie es erwarten können. Ich werde eine längere Antwort dafür geben für zukünftige Referenz. – Matt

Antwort

7

Problem mit Format-Cmdlets

Das Problem hier ist die Nutzung von FT die eine ist Alias ​​für Format-Table. Diese Format- Cmdlets sind für Konsole/Bildschirmausgabe nur ausgelegt. Es gibt viele Dinge, die Sie tun können, um diese Ausgabe anzupassen, aber in jedem Fall muss PowerShell die Daten massieren, um dies zu können. Dazu gehört auch zu den übergebenen Objekten in Gruppen verschiedenen Objekte bricht ...

Microsoft.PowerShell.Commands.Internal.Format.FormatEndData 
Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData 
Microsoft.PowerShell.Commands.Internal.Format.FormatStartData 
Microsoft.PowerShell.Commands.Internal.Format.GroupEndData 
Microsoft.PowerShell.Commands.Internal.Format.GroupStartData 

Die oben genannten Datentypen waren Auszug aus diesem Code ausgeführt wird.

Get-ChildItem c:\temp | Format-Table | Get-Member 

So haben Sie nicht mehr die System.IO.FileInfo und System.IO.DirectoryInfo Objekte, die Sie normalerweise von Get-ChildItem

Ein weiteres großes Problem von Format-Cmdlets Natur zu abgeschnittenen Daten, wie Arrays mit einer großen Anzahl von Elementen kommt bekommen würde oder lange Saiten, um auf dem Bildschirm so gut wie möglich zu passen. Im Falle von Arrays, ist dies aufgrund der Einstellungsvariablen $FormatEnumerationLimit welche bis 4 wird allgemein

Ten Numbers                                     
-----------                                     
{1, 2, 3, 4...} 

Diese vorbelegt, und andere, Beschränkungen können alle mit cmdlet Schaltern wie -AutoSize und -HideTableHeaders, out-string -width gemildert werden, usw. das spielt keine Rolle, aber weil ...


Lösung

Eine gute Nachricht ist die Lösung sehr einfach ist. Hör auf, sie für etwas anderes als die Konsolenausgabe zu verwenden. Verwenden meines früheren Beispiels:

  • Speichern der Ergebnisse in einer Variablen?: $result = Get-ChildItem C:\temp
  • Exportieren von Daten: Get-ChildItem C:\temp | Export-CSV $path -NoTypeInformation.Andere Export- Cmdlets könnten hier wie Export-CLIXml für komplexe Objekte bevorzugt werden, wenn Sie sie für die Verwendung an anderer Stelle speichern möchten. Wenn Sie nur etwas Hübsches suchen, das in Ihre Ausgabe einbezogen werden soll, dann überlegen Sie sich stattdessen ConvertTo-HTML.

  • Extrahieren einzelner Eigenschaften?: Verwenden Sie einfach Select-Object. $result | Select prop1, prop2. Sie können die Eigenschaftsauswahl auch so erweitern, dass nur die Strings oder das String-Array mit -ExpandProperty:

  • abgerufen werden. Durchführen von Inline-Berechnungen mit diesen Eigenschaften?: Use calculated expression genauso wie bei den Format-Cmdlets. $result | Select prop1, @{Name="prop2";Expression={$_.prop2 * 3}

Potential Acceptable Use

Manche bevorzugen die Ausgabe für den Einsatz in E-Mails und zum Aufzeichnen von Statistiken. Es ist zwar integral, um Daten für spätere Verwendung in einem einfacheren Format zu speichern. Wenn Sie diese Daten jedoch wirklich benötigen, beachten Sie, dass Sie nicht mit dem Objekt arbeiten, das Sie ursprünglich hatten.

Also, wenn Sie Ihre Daten in einem Tabellenformat benötigen aber als String gespeichert dann Out-String

$body = Get-ChildItem c:\temp | Format-Table | Out-String 

betrachten aber nicht vergessen, dass Format-Table mit dem Objekt ausgegeben, um spielen wird es auf dem Bildschirm (verkürztes Array angezeigt zu bekommen Eigenschaften und lange Zeichenfolgen). Wirklich .. wenn du es schön und formatiert haben wolltest, dann solltest du einfach ConvertTo-HTML benutzen.

Punkt ist es fast nie erforderlich, die Daten von Format-Tabelle zu halten. Es gibt fast immer einen besseren Weg.

+0

Wow, ich kann nicht glauben, dass es so einfach war. Ich schätze diese Antwort, die mir geholfen hat, das Problem zu verstehen, das ich geschaffen habe, und eine gute Programmierpraxis +1. – Webtron

Verwandte Themen