PowerShell 函数不会返回 DataTable

Bac*_*its 7 datatable powershell

我在 PowerShell v4.0(Windows 7 x64 SP1)上有一个 PowerShell 脚本,它创建了一个非常复杂的数据表。我希望能够很容易地将 DataTable 代码放在任何地方,所以我决定将它包装在一个简单的函数中,如下所示:

function Get-UserDataTable
{
    $DataTable = New-Object -TypeName System.Data.DataTable -ArgumentList 'User';

    $NewColumn = $DataTable.Columns.Add('Id',[System.Int32]);
    $NewColumn.AllowDBNull = $false;
    $NewColumn.Unique = $true;

    $NewColumn = $DataTable.Columns.Add('FirstName',[System.String]);
    $NewColumn.MaxLength = 64;

    $NewColumn = $DataTable.Columns.Add('MiddleName',[System.String]);
    $NewColumn.MaxLength = 64;

    $NewColumn = $DataTable.Columns.Add('LastName',[System.String]);
    $NewColumn.MaxLength = 64;

    return $DataTable;
}
Run Code Online (Sandbox Code Playgroud)

但是,该代码始终返回空对象。我试过Write-Output $DataTable, return $DataTable.Copy(), 和$DataTable,但该函数仍然始终为空。

所以,我想我可以尝试添加一些行。我总是可以清除数据表,这样编码仍然会更少:

function Get-UserDataTable2
{
    $DataTable = New-Object -TypeName System.Data.DataTable -ArgumentList 'User';

    $NewColumn = $DataTable.Columns.Add('Id',[System.Int32]);
    $NewColumn.AllowDBNull = $false;
    $NewColumn.Unique = $true;

    $NewColumn = $DataTable.Columns.Add('FirstName',[System.String]);
    $NewColumn.MaxLength = 64;

    $NewColumn = $DataTable.Columns.Add('MiddleName',[System.String]);
    $NewColumn.MaxLength = 64;

    $NewColumn = $DataTable.Columns.Add('LastName',[System.String]);
    $NewColumn.MaxLength = 64;

    $NewRow = $DataTable.NewRow();
    $NewRow.Id = 1;
    $NewRow.FirstName = 'Test';
    $NewRow.MiddleName = '';
    $NewRow.LastName = 'User';

    $DataTable.Rows.Add($NewRow);

    $NewRow = $DataTable.NewRow();
    $NewRow.Id = 2;
    $NewRow.FirstName = 'Other';
    $NewRow.MiddleName = 'Test';
    $NewRow.LastName = 'User';

    $DataTable.Rows.Add($NewRow);

    return $DataTable;
}
Run Code Online (Sandbox Code Playgroud)

不。此函数返回一个[System.Object[]]包含个人[System.Data.DataRow]。DataRows 的对象数组。

如何从 PowerShell 中的函数返回数据表?

Bac*_*its 10

正如 PerSerAl 评论中的链接所暗示的那样,该问题是由于 DataTable 不是可枚举的数据类型而引起的。要强制它可枚举,您可以使用一元逗号运算符将其作为单个元素放入数组中。数组可枚举的。

function Get-UserDataTable
{
    $DataTable = New-Object -TypeName System.Data.DataTable -ArgumentList 'User';

    $NewColumn = $DataTable.Columns.Add('Id',[System.Int32]);
    $NewColumn.AllowDBNull = $false;
    $NewColumn.Unique = $true;

    $NewColumn = $DataTable.Columns.Add('FirstName',[System.String]);
    $NewColumn.MaxLength = 64;

    $NewColumn = $DataTable.Columns.Add('MiddleName',[System.String]);
    $NewColumn.MaxLength = 64;

    $NewColumn = $DataTable.Columns.Add('LastName',[System.String]);
    $NewColumn.MaxLength = 64;

    return ,$DataTable;
}
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案是有效的,但解释并不完全正确:您没有强制它可枚举,而是通过使用“,”的一元形式创建瞬态单元素包装数组来_防止其枚举_。不幸的是,背景是 PowerShell 有一个硬编码异常,它将“[System.Data.DataTable]”视为实现了“IEnumerable”接口,即使它没有实现。具体来说,在 PowerShell 管道中使用此类实例相当于使用其“.Rows”属性(它返回一个实现“IEnumerable”的集合类型)。 (4认同)