通过powershell管道推动expandos

通过powershell管道推动expandos,powershell,Powershell,不管怎样,有人发现了这一切。我希望使用cmdlet从数据库创建输出。没有具体的模式,每个“行”可以有不同的字段。在javascript之类的东西中,这不会有问题,每个对象都有它需要的任何属性;但powershell不是这样的 我尝试了一个简单的实现,但我得到的只是expandos假装的键值字典的枚举 扩大问题 get-datarows cmdlet应该向下推送哪个对象(它接受任意查询)。我不知道实例化和推送什么对象类型。db查询可以返回一行User=dave,Age=12,然后返回另一行User

不管怎样,有人发现了这一切。我希望使用cmdlet从数据库创建输出。没有具体的模式,每个“行”可以有不同的字段。在javascript之类的东西中,这不会有问题,每个对象都有它需要的任何属性;但powershell不是这样的

我尝试了一个简单的实现,但我得到的只是expandos假装的键值字典的枚举

扩大问题

get-datarows cmdlet应该向下推送哪个对象(它接受任意查询)。我不知道实例化和推送什么对象类型。db查询可以返回一行User=dave,Age=12,然后返回另一行User=pete,Favcol=red。下次运行cmdlet时,查询可能会返回完全不同的结果(Type=shoe,color=red,use=dancing)。在这里,能够实例化expandos管道非常有效(除非它不能)

到目前为止,我最好的方法是使用reflection.emit动态生成一个类型,但这需要我知道对象的模式。我可以通过查看db查询返回的第一个对象来实现这一点,但它可能没有所有可能的属性(如上面的前两个用户行)。我可以一直读到最后;创建动态创建的类型的type、rewind和push实例,但这不是很有效

编辑2:进一步澄清

我正在用c语言编写代码#

我希望能够做到

mycmdlet -query "users" | ft


我不想让用户做一大堆的数据整形;这就是cmdlet的全部用途。没有任何理由不能在管道中包含具有不同属性集的对象。它应该很好用。我总是这样做


你能更具体地说明什么不起作用吗?也许是您正在尝试执行的一个示例?

没有任何理由不能在管道中包含具有不同属性集的对象。它应该很好用。我总是这样做


你能更具体地说明什么不起作用吗?也许是你想做什么的一个例子?

我要么误解了你的问题,要么我一直都在这样做。我的代码正在运行,但在psuedo中-

$results = Get-ResultSet...
$columns = @{}
foreach ($column in $results.Columns)
{
    columns.Add($column.Name,$column.Index)
}
foreach ($row in results)
{
    $return = New-Object PSObject
    foreach ($key in $columns.keys)
    {
        $return | Add-Member -MemberType NoteProperty -name $key $row[$columns[$key]]
    }
    $return
}

自定义对象的属性数与列数相同,每个属性都具有所需的值

要么我误解了你的问题,要么我一直都这么做。我的代码正在运行,但在psuedo中-

$results = Get-ResultSet...
$columns = @{}
foreach ($column in $results.Columns)
{
    columns.Add($column.Name,$column.Index)
}
foreach ($row in results)
{
    $return = New-Object PSObject
    foreach ($key in $columns.keys)
    {
        $return | Add-Member -MemberType NoteProperty -name $key $row[$columns[$key]]
    }
    $return
}

自定义对象的属性数与列数相同,每个属性都具有所需的值

我明白了。powershell有自己的expandos;psobject。这就是WriteObject实际推动的内容。但是你可以自己做

我也是


我想出来了。powershell有自己的expandos;psobject。这就是WriteObject实际推动的内容。但是你可以自己做

我也是


我正在用c#而不是powershell编写cmdlet。这里有一条关键信息——sryi正在用c#而不是powershell编写cmdlet。这里有一条关键信息——在PowerShell中,每个对象都可以有自己的属性。这将导致表格格式出现一些问题,但这是可以做到的。不过,我建议避免这样做。可能对行中没有的字段使用空值。在PowerShell中,每个对象都可以有自己的属性。这将导致表格格式出现一些问题,但这是可以做到的。不过,我建议避免这样做。可能对行中没有的字段使用空白值。
var obj = new PSObject();
obj.properties.add(new PSNoteProperty("foo", 42));
obj.properties.add(new PSNoteProperty("bar", "xxxx"));
WriteObject(obj);