如何设置 PowerShell 的默认输出 class
How to set the default output of a PowerShell class
我正在尝试创建一个从标准 [Data.DataTable]
class 派生的 PowerShell [DataTable]
class 以简化数据的创建 tables:
(另见:#11987
Accelerated [DataTable] with easy constructor and AddRow method)
class DataTable : Data.DataTable {
[ValidateNotNullOrEmpty()][Data.DataTable]$DataTable
DataTable([Array]$ColumnNames) {
$This.DataTable = New-Object Data.DataTable
ForEach ($ColumnName in $ColumnNames) {
If ($ColumnName -is [System.Collections.IDictionary]) {
ForEach($Key in $ColumnName.Get_keys()) { $This.AddColumn($Key, $ColumnName[$Key]) }
} Else { $This.AddColumn($ColumnName) }
}
}
[Void]AddColumn([String]$ColumnName) {
$DataColumn = New-Object Data.DataColumn($ColumnName)
$This.DataTable.Columns.Add($DataColumn)
}
[Void]AddColumn([String]$ColumnName, [Type]$ColumnType = [String]) {
$DataColumn = New-Object Data.DataColumn($ColumnName, $ColumnType)
$This.DataTable.Columns.Add($DataColumn)
}
[Void]AddRow([Array]$Array) {
$DataRow = $This.DataTable.NewRow()
For ($i = 0; $i -lt $Array.Length; $i++) { $DataRow.Item($i) = $Array[$i] }
$This.DataTable.Rows.Add($DataRow)
}
[Void]AddRow([System.Collections.IDictionary]$Dictionary) {
$DataRow = $This.DataTable.NewRow()
ForEach ($Name in $Dictionary.get_Keys()) { $DataRow.Item($Name) = $Dictionary[$Name] }
$This.DataTable.Rows.Add($DataRow)
}
}
它适用于创建新数据table:
$MyDataTable = [DataTable]('a', 'b', 'c')
$MyDataTable.AddRow(@(1,2,3))
但要获得 $DataTable
需要做的事情:
$MyDataTable.DataTable
a b c
- - -
1 2 3
我希望它默认输出数据 table $MyDataTable
.DataTable
并执行如下操作:
$MyDataTable | ForEach-Object { ...
如何让我的 class 默认为 return $This.DataTable
?
(或者这对于 PowerShell class 根本不可能吗?)
更新
class 中有一些(与问题无关的)错误,我在下面连同 @Adam Luniewski.
的答案一起修复了这些错误
class DataTable : Data.DataTable {
DataTable([Array]$ColumnNames) {
ForEach ($ColumnName in $ColumnNames) { $This.AddColumn($ColumnName) }
}
DataTable([System.Collections.IDictionary]$ColumnNameTypes) {
ForEach($Key in $ColumnNameTypes.Get_keys()) { $This.AddColumn($Key, $ColumnNameTypes[$Key]) }
}
[Void]AddColumn([String]$ColumnName) {
$DataColumn = New-Object Data.DataColumn($ColumnName)
$This.Columns.Add($DataColumn)
}
[Void]AddColumn([String]$ColumnName, [Type]$ColumnType = [String]) {
$DataColumn = New-Object Data.DataColumn($ColumnName, $ColumnType)
$This.Columns.Add($DataColumn)
}
[Void]AddRow([Array]$Array) {
$DataRow = $This.NewRow()
For ($i = 0; $i -lt $Array.Length; $i++) { $DataRow.Item($i) = $Array[$i] }
$This.Rows.Add($DataRow)
}
[Void]AddRow([System.Collections.IDictionary]$Dictionary) {
$DataRow = $This.NewRow()
ForEach ($Name in $Dictionary.get_Keys()) { $DataRow.Item($Name) = $Dictionary[$Name] }
$This.Rows.Add($DataRow)
}
}
您的新 class 正在扩展 DataTable,因此它已经是 DataTable。您不需要内部 DataTable 并且可以对 $This 而不是 $This.DataTable 执行所有操作。我只将 class 的名称更改为 MyDataTable 并删除了内部数据表:
class MyDataTable : Data.DataTable {
MyDataTable([Array]$ColumnNames) {
ForEach ($ColumnName in $ColumnNames) {
If ($ColumnName -is [System.Collections.IDictionary]) {
ForEach($Key in $ColumnName.Get_keys()) { $This.AddColumn($Key, $ColumnName[$Key]) }
} Else { $This.AddColumn($ColumnName) }
}
}
[Void]AddColumn([String]$ColumnName) {
$DataColumn = New-Object Data.DataColumn($ColumnName)
$This.Columns.Add($DataColumn)
}
[Void]AddColumn([String]$ColumnName, [Type]$ColumnType = [String]) {
$DataColumn = New-Object Data.DataColumn($ColumnName, $ColumnType)
$This.Columns.Add($DataColumn)
}
[Void]AddRow([Array]$Array) {
$DataRow = $This.NewRow()
For ($i = 0; $i -lt $Array.Length; $i++) { $DataRow.Item($i) = $Array[$i] }
$This.Rows.Add($DataRow)
}
[Void]AddRow([System.Collections.IDictionary]$Dictionary) {
$DataRow = $This.NewRow()
ForEach ($Name in $Dictionary.get_Keys()) { $DataRow.Item($Name) = $Dictionary[$Name] }
$This.Rows.Add($DataRow)
}
}
$MyDataTable = [MyDataTable]('a', 'b', 'c')
$MyDataTable.AddRow(@(1,2,3))
$MyDataTable #works now:
a b c
- - -
1 2 3
我正在尝试创建一个从标准 [Data.DataTable]
class 派生的 PowerShell [DataTable]
class 以简化数据的创建 tables:
(另见:#11987
Accelerated [DataTable] with easy constructor and AddRow method)
class DataTable : Data.DataTable {
[ValidateNotNullOrEmpty()][Data.DataTable]$DataTable
DataTable([Array]$ColumnNames) {
$This.DataTable = New-Object Data.DataTable
ForEach ($ColumnName in $ColumnNames) {
If ($ColumnName -is [System.Collections.IDictionary]) {
ForEach($Key in $ColumnName.Get_keys()) { $This.AddColumn($Key, $ColumnName[$Key]) }
} Else { $This.AddColumn($ColumnName) }
}
}
[Void]AddColumn([String]$ColumnName) {
$DataColumn = New-Object Data.DataColumn($ColumnName)
$This.DataTable.Columns.Add($DataColumn)
}
[Void]AddColumn([String]$ColumnName, [Type]$ColumnType = [String]) {
$DataColumn = New-Object Data.DataColumn($ColumnName, $ColumnType)
$This.DataTable.Columns.Add($DataColumn)
}
[Void]AddRow([Array]$Array) {
$DataRow = $This.DataTable.NewRow()
For ($i = 0; $i -lt $Array.Length; $i++) { $DataRow.Item($i) = $Array[$i] }
$This.DataTable.Rows.Add($DataRow)
}
[Void]AddRow([System.Collections.IDictionary]$Dictionary) {
$DataRow = $This.DataTable.NewRow()
ForEach ($Name in $Dictionary.get_Keys()) { $DataRow.Item($Name) = $Dictionary[$Name] }
$This.DataTable.Rows.Add($DataRow)
}
}
它适用于创建新数据table:
$MyDataTable = [DataTable]('a', 'b', 'c')
$MyDataTable.AddRow(@(1,2,3))
但要获得 $DataTable
需要做的事情:
$MyDataTable.DataTable
a b c
- - -
1 2 3
我希望它默认输出数据 table $MyDataTable
并执行如下操作:.DataTable
$MyDataTable | ForEach-Object { ...
如何让我的 class 默认为 return $This.DataTable
?
(或者这对于 PowerShell class 根本不可能吗?)
更新
class 中有一些(与问题无关的)错误,我在下面连同 @Adam Luniewski.
class DataTable : Data.DataTable {
DataTable([Array]$ColumnNames) {
ForEach ($ColumnName in $ColumnNames) { $This.AddColumn($ColumnName) }
}
DataTable([System.Collections.IDictionary]$ColumnNameTypes) {
ForEach($Key in $ColumnNameTypes.Get_keys()) { $This.AddColumn($Key, $ColumnNameTypes[$Key]) }
}
[Void]AddColumn([String]$ColumnName) {
$DataColumn = New-Object Data.DataColumn($ColumnName)
$This.Columns.Add($DataColumn)
}
[Void]AddColumn([String]$ColumnName, [Type]$ColumnType = [String]) {
$DataColumn = New-Object Data.DataColumn($ColumnName, $ColumnType)
$This.Columns.Add($DataColumn)
}
[Void]AddRow([Array]$Array) {
$DataRow = $This.NewRow()
For ($i = 0; $i -lt $Array.Length; $i++) { $DataRow.Item($i) = $Array[$i] }
$This.Rows.Add($DataRow)
}
[Void]AddRow([System.Collections.IDictionary]$Dictionary) {
$DataRow = $This.NewRow()
ForEach ($Name in $Dictionary.get_Keys()) { $DataRow.Item($Name) = $Dictionary[$Name] }
$This.Rows.Add($DataRow)
}
}
您的新 class 正在扩展 DataTable,因此它已经是 DataTable。您不需要内部 DataTable 并且可以对 $This 而不是 $This.DataTable 执行所有操作。我只将 class 的名称更改为 MyDataTable 并删除了内部数据表:
class MyDataTable : Data.DataTable {
MyDataTable([Array]$ColumnNames) {
ForEach ($ColumnName in $ColumnNames) {
If ($ColumnName -is [System.Collections.IDictionary]) {
ForEach($Key in $ColumnName.Get_keys()) { $This.AddColumn($Key, $ColumnName[$Key]) }
} Else { $This.AddColumn($ColumnName) }
}
}
[Void]AddColumn([String]$ColumnName) {
$DataColumn = New-Object Data.DataColumn($ColumnName)
$This.Columns.Add($DataColumn)
}
[Void]AddColumn([String]$ColumnName, [Type]$ColumnType = [String]) {
$DataColumn = New-Object Data.DataColumn($ColumnName, $ColumnType)
$This.Columns.Add($DataColumn)
}
[Void]AddRow([Array]$Array) {
$DataRow = $This.NewRow()
For ($i = 0; $i -lt $Array.Length; $i++) { $DataRow.Item($i) = $Array[$i] }
$This.Rows.Add($DataRow)
}
[Void]AddRow([System.Collections.IDictionary]$Dictionary) {
$DataRow = $This.NewRow()
ForEach ($Name in $Dictionary.get_Keys()) { $DataRow.Item($Name) = $Dictionary[$Name] }
$This.Rows.Add($DataRow)
}
}
$MyDataTable = [MyDataTable]('a', 'b', 'c')
$MyDataTable.AddRow(@(1,2,3))
$MyDataTable #works now:
a b c
- - -
1 2 3