2017-02-22 24 views
5

у меня есть Командлет в моем модуле, который возвращает коллекцию общего DataRows из таблицы базы данных, имя которого задаются с -Name параметромDataRow с динамическими свойствами

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

Каждый раз, когда я называю Командлет на разных таблицах I выведите выходной сигнал на 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 типа, но свойства имеют разные названия каждый раз, и это похоже, я не могу удалить тег <TableRowEntries> из приведенного выше шаблона XML.

Любая идея?

+0

Я бы либо изменить командлет с '-FormatTable' переключателем, или если вы не можете изменить источник, напишите обертку для него 'Get-FormattedTable' или что-то еще. – TToni

+0

@TToni Я могу редактировать командлет, но как заставить его записывать строки в виде таблицы? Я возвращаю строки с помощью 'WriteObject (MyDataTable.Rows, true);' –

+0

Я принял командлет сценария, где это было бы легко. Я не знаю, как это сделать с помощью командлета C# или если это возможно. Так что в вашем случае я бы пошел с оболочкой сценария PowerShell (т. Е. Новой функцией скрипта, которая просто перенаправляет параметры в исходный командлет и выводится через «Формат-таблица») – TToni

ответ

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

Благодарим вас за эту идею, но я не только теряю заголовки заголовков (как вы уже упоминали), но я ограничены отображением n свойств, и число полей в таблице динамически. Спасибо, в любом случае –