2017-02-22 28 views
5

我有我的模塊中的小命令從數據庫表返回通用的DataRows的集合,他的名字與-Name參數DataRow的動態特性

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

我每次調用上不同的表cmdlet中指定我輸出到Format-Table,這使得它更具可讀性。

是否有任何方法可以將屬性格式化爲一個表格,而無需每次都將管道傳送到Format-Table?告訴PowerShell始終使用表格佈局顯示DataRow類型的東西?

我已經與模塊有一個ps1xml文件一起,包含一些格式規則是這樣的:

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

我想使用類似的規則System.Data.DataRow型,但性質每次有不同的名稱,它似乎我無法從上面的XML模板中刪除<TableRowEntries>標記。

有什麼想法?

+0

我要麼用'-FormatTable'開關修改cmdlet,要麼不能修改來源,爲它寫'Get-FormattedTable'的包裝器什麼的。 – TToni

+0

@Toni我可以編輯該cmdlet,但如何使它將行寫入表中?我現在用'WriteObject(MyDataTable.Rows,true)'返回行;' –

+0

我假設了一個腳本cmdlet,在這裏很容易。我不知道如何用C#cmdlet來做到這一點,或者甚至可能。所以在你的情況下,我會用一個PowerShell腳本包裝器(即一個新的腳本函數,它只是將參數路由到原始cmdlet並通過'Format-Table'輸出) – TToni

回答

1

我會說爲了讓PowerShell將對象輸出爲表格而編寫自定義格式文件太費勁了。

如果你真的想嘗試它,你已經走上了正軌。

我想出了一個簡單的格式定義,將DataRows作爲表格輸出。

但有一點需要注意:我不認爲每個列都有自定義標籤(您需要再次檢查模式定義:https://msdn.microsoft.com/en-us/library/gg580910(v=vs.85).aspx)。在我的例子,我只是使用通用名稱,如「字段1」,「字段2」等

這裏是2列的格式定義:

$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> 
'@ 

更新格式定義:

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

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

Update-FormatData -Appendpath $FormatPath 

並輸出示例:

$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

謝謝你的想法,但這樣我不僅會丟失標題名稱(正如你所提到的),但我也限於顯示n個屬性,我的表字段計數是動態的。不管怎麼說,還是要謝謝你 –