2011-05-23 66 views
1

无论如何发现任何人做到这一点。我想要一个从数据库创建输出的cmdlet。没有具体的模式,每个'行'可以有不同的字段。在像JavaScript这样的东西没有问题,每个对象都会有它需要的任何属性;但powershell不是那样的。通过powershell管道推送expandos

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

扩大问题。

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

我迄今为止最好的去使用reflection.emit生成一个类型,但这需要我知道对象。我可以通过查看数据库查询返回的第一个对象来实现,但这可能不具有所有可能的属性(如上面的前两个用户行)。我可以一直读到最后;使型,快退和动态创建类型的推动情况,但那不是很有效

EDIT2:更澄清

我在C#编码

我希望能够做

mycmdlet -query "users" | ft 

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

我不希望用户必须做大量的数据整形;这就是cmdlet的全部用途

+0

在PowerShell中,每个对象都可以有自己的属性。这会导致表格格式化的一些问题,但可以完成。我会建议避免这个。也许在行不具有的字段上使用空白值。 – JasonMArcher 2011-06-17 20:50:07

回答

1

我想通了。 PowerShell有自己的扩展; psobject。这是WriteObject实际推送的内容。但是你可以让自己的

所以做

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

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

你能更具体地了解什么是不工作?也许你想要做什么的例子?

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 
} 

您的自定义对象将有多达性质为列,每个属性将有你想要的值。

+0

我正在编写一个cmdlet,而不是使用powershell。关键信息 - 斯里 – pm100 2011-05-24 00:57:53