如何设置PowerShell类的默认输出 [英] How to set the default output of a PowerShell class

查看:79
本文介绍了如何设置PowerShell类的默认输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个从标准 [Data.DataTable] 类派生的PowerShell [DataTable] 类,以简化数据表的创建:
(另请参见: #11987 轻松加速[DataTable]构造函数和AddRow方法)

I am trying to create a PowerShell [DataTable] class derived from the standard [Data.DataTable] class to ease the creation of data tables:
(see also: #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)
    }
}

它可用于创建新的数据表:

It works for creating new data table:

$MyDataTable = [DataTable]('a', 'b', 'c')
$MyDataTable.AddRow(@(1,2,3))

但是要获得 $ DataTable ,需要做的事情:

But to get the $DataTable in need to do:

$MyDataTable.DataTable
a b c
- - -
1 2 3

我希望它默认输出数据表 $ MyDataTable .DataTable 并执行以下操作:

I want it to output the data table by default $MyDataTable.DataTable and do things like this:

$MyDataTable | ForEach-Object { ...

如何让我的班级默认返回 $ This.DataTable ?
(或者使用PowerShell类根本不可能吗?)

How can I let my class the return $This.DataTable by default?
(or is this simply not possible with a PowerShell class?)

更新
我在下面解决了该班级中的一些(与问题无关)错误,以及来自 @Adam Luniewski 的答案a>.

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

推荐答案

您的新类正在扩展DataTable,因此它已经是DataTable.您不需要内部DataTable,并且可以对$ This(而不是$ This.DataTable)执行所有操作.我只将类的名称更改为MyDataTable并删除了内部DataTable:

Your new class is extending DataTable, so it already IS DataTable. You don't need inner DataTable and can perform all the operations on $This instead of $This.DataTable. I only changed the name of the class to MyDataTable and removed inner DataTable:

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

这篇关于如何设置PowerShell类的默认输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆