将数据 (DataTable) 从 powershell 管道传输到 Commandlet C#

Transferring data ( DataTable) from powershell pipeline to Commandlet C#

我想将 DataTable 从 Powershell 管道传输到基于 C# 的命令行开关。目前,它遍历整个数据 table 并仅传输一个完全不好的 DataRow。我希望将完整数据 table 从 PowerShell 管道传输到 commandlet 参数。

以下是我的 C# commandlet 代码,其中参数 'ParameterValue' 需要完整的数据 table。

[Cmdlet(VerbsCommon.Set, "LinkParameter")]  
public class SetLinkParameter : PSCmdlet
{
    [Parameter(Position = 0, Mandatory = true)]
    public string ParameterName { get; set; }

    [Parameter(ValueFromPipeline = true, Position = 1)] // The data or dataTable appear in this variable
    public PSObject ParameterValue { get; set; }
}

下面是我正在执行的脚本。

$table = New-Object system.Data.DataTable 'DataTable'

$newcol = New-Object system.Data.DataColumn ColumnStringA,([string]); $table.columns.add($newcol)
$newcol = New-Object system.Data.DataColumn ColumnStringB,([string]); $table.columns.add($newcol)
$newcol = New-Object system.Data.DataColumn ColumnLongC,([long]); $table.columns.add($newcol)


$row = $table.NewRow()
$row.ColumnStringA = ("ColumnStringA")
$row.ColumnStringB = ("ColumnStringB")
$row.ColumnLongC =  45781547

$table.Rows.Add($row) 

$table| Set-LinkParameter 

虽然上面的 Set-LinkParameter 命令已执行并且 ParameterValue 在那里获取了它的值,但它根本不是数据 table。这将成为 DataRow 的集合或单个 DataRow。可能管道执行集合并简单地枚举。 这怎么能停止?我想要接收端的完整数据 table 而不是数据行或单个数据行。另一方面我希望它通过管道方式设置。

正如 PetSerAI 和 iRon 提到的那样。我们可以同时使用这两种技术。 Write-Output -NoEnumerate 或 put ,在传递到管道之前的 dataTable 变量之前。它不会枚举和传递单个行,但会整体传递整个集合。

您还可以从该单个数据行中获取对数据表的引用:

if($dt.GetType().Name -eq "DataRow"){$dt = $dt.Table }