2011-05-23 64 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