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

时间:2018-07-11 07:41:47

标签: c# powershell pipeline cmdlets

我想将DataTable从Powershell Pipeline传输到基于C#的Commandlet。目前,它遍历整个数据表并仅传输单个DataRow,这完全是不好的。我希望将完整的数据表从PowerShell管道传输到Commandlet参数。

以下是我的C#Commandlet代码,其中“ ParameterValue”参数需要完整的数据表。

[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在此处获得其值,但它根本不是数据表。这将成为DataRow或单个DataRow的集合。 PEhaps管道执行收集并简单地枚举。 如何停止呢?我想要接收方的完整数据表,而不是数据行或单个数据行。另一方面,我希望通过管道方式进行设置。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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