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.
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