我想将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管道执行收集并简单地枚举。 如何停止呢?我想要接收方的完整数据表,而不是数据行或单个数据行。另一方面,我希望通过管道方式进行设置。
答案 0 :(得分:1)
就像PetSerAI和iRon提到的那样。我们可以同时使用两种技术。在传递到管道之前,在dataTable变量之前写入-Output -NoEnumerate或put。它不会枚举并传递单个行,但会集体传递整个集合。
答案 1 :(得分:0)
您还可以从单个数据行中获取对数据的引用:
if($dt.GetType().Name -eq "DataRow"){$dt = $dt.Table }