2017-02-22 5 views
5

ich ein Cmdlet in meinem Modul haben, das eine Sammlung von generischen DataRows aus einer Datenbanktabelle zurückgibt, deren Name mit -Name ParameterDataRow mit dynamischen Eigenschaften

# this returns a collection of datarows from table "Orders" 
Get-Table -Name Orders 

Jedes Mal, wenn ich rufen Sie die Cmdlets auf verschiedenen Tabellen angegeben I Pipe die Ausgabe zu Format-Table, die es lesbarer macht.

Gibt es eine Möglichkeit, die Eigenschaften als Tabelle formatiert zu halten, ohne jedes Mal eine Pipeline an Format-Table? Etwas, das PowerShell anweist, das Tabellenlayout immer zum Anzeigen des DataRow-Typs zu verwenden?

Ich habe bereits eine ps1xml Datei zusammen mit dem Modul, eine Formatregel wie folgt enthalten:

<View> 
    <Name>MyType</Name> 
    <ViewSelectedBy> 
    <TypeName>MyNamespace.MyType</TypeName> 
    </ViewSelectedBy> 
    <TableControl> 
    <TableRowEntries> 
     <TableRowEntry> 
     <TableColumnItems> 
      <TableColumnItem> 
      <PropertyName>Property1</PropertyName> 
      </TableColumnItem> 
      <TableColumnItem> 
      <PropertyName>Property2</PropertyName> 
      </TableColumnItem> 
      [...] 
     </TableColumnItems> 
     </TableRowEntry> 
    </TableRowEntries> 
    </TableControl> 
</View> 

I für System.Data.DataRow Typen eine ähnliche Regel zu verwenden, gedacht, aber die Eigenschaften haben unterschiedliche Namen jedes Mal, und es scheint, dass ich das <TableRowEntries>-Tag aus der obigen XML-Vorlage nicht entfernen kann.

Irgendeine Idee?

+0

ich entweder das Cmdlet mit einem '-FormatTable' Schalter ändern würde, oder wenn Sie nicht ändern können die Quelle, schreibe einen Wrapper dafür 'Get-FormattedTable' oder so. – TToni

+0

@TToni Ich kann das Cmdlet bearbeiten, aber wie schreibt man die Zeilen als Tabelle? Ich gebe derzeit die Zeilen mit 'WriteObject (MyDataTable.Rows, true);' –

+0

Ich nahm ein Skript-Cmdlet, wo dies leicht wäre. Ich weiß nicht, wie man das mit einem C# Cmdlet macht oder ob es überhaupt möglich ist. In Ihrem Fall würde ich also einen PowerShell-Skript-Wrapper verwenden (dh eine neue Skriptfunktion, die nur die Parameter an das ursprüngliche Cmdlet und die Ausgabe über 'Format-Table' weiterleitet). – TToni

Antwort

1

Ich würde sagen, dass es zu viel Aufwand ist, eine benutzerdefinierte Formatdatei zu schreiben, nur damit PowerShell Objekte als Tabelle ausgeben kann.

Wenn Sie es wirklich versuchen wollen, sind Sie bereits auf dem richtigen Weg.

Ich kam mit einer einfachen Formatdefinition, die DataRows als Tabelle ausgibt.

Es gibt jedoch eine Einschränkung: Ich denke nicht, dass es möglich ist, benutzerdefinierte Beschriftungen für jede Spalte (Sie müssten die Schemadefinition erneut überprüfen: https://msdn.microsoft.com/en-us/library/gg580910(v=vs.85).aspx). In meinem Beispiel bin mit Gattungsnamen ich wie "Field1", "Feld2" usw.

Hier ist die Formatdefinition für 2 Spalten:

$TableFormat = @' 
<Configuration> 
<ViewDefinitions> 
    <View> 
     <Name>MyTable</Name> 
     <ViewSelectedBy> 
     <TypeName>System.Data.DataRow</TypeName> 
     </ViewSelectedBy> 
     <TableControl> 
     <TableHeaders> 
     <TableColumnHeader> 
      <Label>Field 1</Label> 
      <Width>20</Width> 
     </TableColumnHeader> 
     <TableColumnHeader> 
      <Label>Field 2</Label> 
      <Width>20</Width> 
     </TableColumnHeader> 
     </TableHeaders> 
     <TableRowEntries> 
      <TableRowEntry> 
      <TableColumnItems> 
      <TableColumnItem> 
       <ScriptBlock>$_.Item(0)</ScriptBlock> 
       </TableColumnItem> 
      <TableColumnItem> 
       <ScriptBlock>$_.Item(1)</ScriptBlock> 
      </TableColumnItem> 
      </TableColumnItems> 
      </TableRowEntry> 
     </TableRowEntries> 
     </TableControl> 
    </View> 
    </ViewDefinitions> 
</Configuration> 
'@ 

die Formatdefinition aktualisiert:

$FormatPath = Join-Path -Path $PSScriptRoot -ChildPath "DataTable.format.ps1xml" 

$TableFormat | Set-Content -Path $FormatPath -Encoding Default 

Update-FormatData -Appendpath $FormatPath 

und ein Beispiel für die Ausgabe:

$CnStr = "Data Source=Starbase1\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI" 

$Sql = "Select LastName, City From Employees Where City <> 'Seattle'" 

$Da = New-Object -TypeName System.Data.SqlClient.SqlDataAdapter -ArgumentList $Sql, $CnStr 
$Ta = New-Object -TypeName System.Data.DataTable 
$Da.Fill($Ta) 
$Ta 
+0

Vielen Dank für die Idee, aber auf diese Weise verliere ich nicht nur Header-Namen (wie Sie erwähnt haben), sondern ich bin auch auf die Anzeige n Eigenschaften beschränkt und meine Tabelle Felder zählen ist dynamisch. Danke trotzdem –

Verwandte Themen