通过powershell管道推动expandos

时间:2011-05-23 22:18:04

标签: powershell

无论如何,任何人都发现了这一点。我想拥有一个从数据库创建输出的cmdlet。没有具体的架构,每个'row'可以有不同的字段。在像javascript这样的东西中没有问题,每个对象都有它需要的任何属性;但是powershell不是那样的。

我尝试了一个天真的实现,但我得到的只是枚举扩展假装的Key,Value字典。

扩大问题。

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

我最好的目的是使用reflection.emit动态生成一个类型,但这需要我知道对象的模式。我可以通过查看db查询返回的第一个对象来完成它,但可能没有所有可能的属性(如上面的前2个用户行)。我可以一直读到最后;制作动态创建类型的类型,倒带和推送实例,但效率不高

EDIT2:更加澄清

我在c#编码

我希望能够做到

mycmdlet -query "users" | ft

mycmdlet -query "products;type=shoe,size>1" | make-pretty

我不希望用户必须进行一大堆数据整形;这就是cmdlet的全部目的

3 个答案:

答案 0 :(得分:1)

我明白了。 powershell有自己的扩展; psobject。这是WriteObject推动的行为。但你可以自己制作

所以

var obj = new PSObject();
obj.properties.add(new PSNoteProperty("foo", 42));
obj.properties.add(new PSNoteProperty("bar", "xxxx"));
WriteObject(obj);

答案 1 :(得分:0)

没有任何理由不能在管道中拥有具有不同属性集的对象。它应该工作正常。我一直这样做。

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

答案 2 :(得分:0)

我要么误解你的问题,要么就是我一直这么做。我的代码全部正常运行,但是在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
}

您的自定义对象将具有与列一样多的属性,并且每个属性都将具有您想要的值。