我一直在尝试编写一个实用程序函数,它将返回初始化的[System.Data.DataTable]
对象数据类型。
我知道恼人的PowerShell函数返回行为,它试图将所有内容“展开”为[System.Array]
返回类型。
以前我一直设法解决这个问题。
通常使用“逗号技巧”来返回自己的数组@(,$result)
远离工作 - 但这次这似乎没有什么区别,我已经用完了选项......
我通常使用的另一个技巧是Process块中的$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
}
}
我希望有人可以使这段代码正常工作......
答案 0 :(得分:6)
而不是return
使用Write-Output -NoEnumerate
。例如:
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
,它可能看起来像一样,但Get-Member
会告诉您返回的实际类型。
答案 1 :(得分:0)
当我使用DataTable
加载包含类型的程序集并使用LoadWithPartialName
将其输出时,我从问题中获得了返回Out-Null
类型的函数。
不要问我为什么,但如果你知道原因,请随时评论。
工作功能代码如下。请注意,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
Write-Output -NoEnumerate $variable
返回类型 - 点数转为Burt_Harris 最后,在Burt_Harris(THANKS Burt!)的输入后,这个问题的函数的最终工作版本是:
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
}
}