我的模块中有一个cmdlet,它从数据库表中返回一个通用DataRows的集合,其名称用-Name
参数
# 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>
标记。< / p>
有什么想法吗?
答案 0 :(得分:1)
我想说,编写自定义格式文件只是为了让PowerShell将对象输出为表格,这是太费劲了。
如果您真的想尝试一下,那么您已经走上正轨了。
我提出了一个简单的格式定义,将DataRows作为表格输出。
但有一点需要注意:我认为不可能为每列提供自定义标签(您必须再次检查架构定义:https://msdn.microsoft.com/en-us/library/gg580910(v=vs.85).aspx)。在我的例子中,我只使用通用名称,如“Field1”,“Field2”等。
以下是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