2016-09-14 14 views
1

私は、初期化された[System.Data.DataTable]オブジェクトデータ型を返すユーティリティ関数を作成しようとしています。PowerShell関数(DataTable)から特定のデータ型を返す方法

私は迷惑なPowerShell関数の復帰動作を認識しており、すべてを返して[System.Array]の戻り値の型にしようとします。 以前私はいつもその問題を回避することができました。通常は "comma trick"を使用して自分自身の配列を返します。@(,$result) - 今回はこれで違いはなく、オプションがなくなってしまいました...

私が通常使う別のトリックは$nullですプロセスブロック(私のコードは以下を参照してください) - この方法でパイプラインをだまして、出力を "展開"することはありません...

私の答えには不可能ではありません。 PowerShellでは不可能です:)

ここに私のコードです:

function Get-SourceDataTable 
{ 
    [OutputType([System.Data.DataTable])] 
    [cmdletbinding()] 
    param(
     [parameter(Mandatory=$true, Position=0)] 
     [System.Data.SqlClient.SqlBulkCopy] $Destination, 
     [parameter(Mandatory=$true, Position=1)] 
     [System.Collections.Specialized.OrderedDictionary] $ColumnDefinition, 
     [parameter(Mandatory=$false, Position=2)] 
     [int]$ColumnStartIndex = 0 
    ) 
    BEGIN{ 
     $datatable = New-Object System.Data.DataTable 
     $colIndex = $ColumnStartIndex 
    } 
    PROCESS{ 
     $ColumnDefinition.Keys | 
     foreach { 
      $null = $datatable.Columns.Add($_, $ColumnDefinition[$_]) # define each column name and data type 
      $null = $Destination.ColumnMappings.Add($_, $colIndex) # map column to destination table 
      $colIndex++ 
     } 
    } 
    END{ 
     return ,$datatable 
    } 
} 

私は誰かがむしろreturn使用Write-Output -NoEnumerateよりも...作業

+0

あなたが試してみました出力をDataTableとしてキャストするだけですか? '[system.data.datatable] $ MyVar = Get-SourceDataTable $ Dest $ ColDef' – TheMadTechnician

+0

はい、出力タイプに影響しないキャストを試しました – Emil

答えて

3

をこのコードを得ることができると思います。たとえば、次のように

function New-DataTable { 
    $datatable = New-Object System.Data.DataTable 
    $null = $datatable.Columns.Add("x",[int]) 
    $null = $datatable.Columns.Add("y",[int]) 
    $null = $datatable.Rows.Add(@(1,2)) 
    $null = $dataTable.Rows.Add(@(3,4)) 
    Write-Output -NoEnumerate $datatable 
} 

New-DataTable | Get-Member 

注しかし、あなただけのNew-DataTableを入力すると、それはenumberated行のようなに見えるかもしれませんが、あなたが実際の型が返さGet-Member伝えること。

0

LoadWithPartialNameを使用して型を含むアセンブリをロードし、Out-Nullでパイプすると、DataTable型を返すという質問から関数を取得しました。

私の理由を聞かないでください。理由を知っていれば、お気軽にコメントしてください。

作業機能コードは以下のとおりです。 return文は、私が唯一のコードの可読性を向上させるためにそれを使用する必要はありません。

function Get-SourceDataTable 
{ 
    [OutputType([System.Data.DataTable])] 
    [cmdletbinding()] 
    param(
     [parameter(Mandatory=$true, Position=0)] 
     [System.Data.SqlClient.SqlBulkCopy] $Destination, 
     [parameter(Mandatory=$true, Position=1)] 
     [System.Collections.Specialized.OrderedDictionary] $ColumnDefinition, 
     [parameter(Mandatory=$false, Position=2)] 
     [int]$ColumnStartIndex = 0 
    ) 
    BEGIN{ 
     [System.Reflection.Assembly]::LoadWithPartialName("System.Data") | Out-Null 
     $datatable = New-Object System.Data.DataTable 
     $colIndex = $ColumnStartIndex 
    } 
    PROCESS{ 
     $ColumnDefinition.Keys | 
     foreach { 
      $null = $datatable.Columns.Add($_, $ColumnDefinition[$_]) # define each column name and data type 
      $null = $Destination.ColumnMappings.Add($_, $colIndex) # map column to destination table 
      $colIndex++ 
     } 
    } 
    END{ 
     return ,$datatable 
    } 
} 

特定のデータ型を返すために、PowerShellの機能を強制する問題に対する既知のすべての可能な解決策要約すると:

  • 使用を$null配列,$variable
  • 使用LoadWithPartialName("Assembly.Name") | Out-Null
  • 使用を返すために割り当て
  • 使用コンマ型を返すために- クレジットはBurt_Harris

に行く最後に、Burt_Harrisから入力プログラムの後に(!THANKSバート)この質問から関数の最後の作業バージョンはこれです:

function Get-SourceDataTable 
{ 
    [OutputType([System.Data.DataTable])] 
    [cmdletbinding()] 
    param(
     [parameter(Mandatory=$true, Position=0)] 
     [System.Data.SqlClient.SqlBulkCopy] $Destination, 
     [parameter(Mandatory=$true, Position=1)] 
     [System.Collections.Specialized.OrderedDictionary] $ColumnDefinition, 
     [parameter(Mandatory=$false, Position=2)] 
     [int]$ColumnStartIndex = 0 
    ) 
    BEGIN{ 
     #[System.Reflection.Assembly]::LoadWithPartialName("System.Data") | Out-Null 
     $datatable = New-Object System.Data.DataTable 
     $colIndex = $ColumnStartIndex 
    } 
    PROCESS{ 
     $ColumnDefinition.Keys | 
     foreach { 
      $null = $datatable.Columns.Add($_, $ColumnDefinition[$_]) # define each column name and data type 
      $null = $Destination.ColumnMappings.Add($_, $colIndex) # map column to destination table 
      $colIndex++ 
     } 
    } 
    END{ 
     #return ,$datatable 
     Write-Output -NoEnumerate $datatable 
    } 
} 
関連する問題