2009-06-23 2 views
5

Sono nuovo nell'utilizzo di web services in powershell, quindi forse ho un malinteso di base su qualcosa. Sto lavorando con Microsoft Reporting Services. Ecco uno script di riproduzione.PowerShell, servizi Web e tipi di oggetto

$computer = "rptdev" 
$uri = "http://$($computer)/ReportServer/ReportService.asmx?WSDL" 

$reporting = New-WebServiceProxy -uri $uri -UseDefaultCredential -namespace "ReportingWebService" 

$dsRef = new-object ReportingWebService.DataSourceReference 
$ds = new-object ReportingWebService.DataSource 

$dsRef.GetType() 
$ds.GetType() 

Se corro questo, ho ottenere qualcosa che sembra più o meno così:

Name    BaseType 
----    -------- 
DataSourceReference ReportingWebService.DataSourceDefinitionOrReference 
DataSource   System.Object 

Quindi, la mia domanda è: Perché il DataSource avere System.Object come BaseType quando DataSourceReference ha chiaramente un oggetto tipo che si basa sull'oggetto web? Sono stati entrambi creati dallo spazio dei nomi ReportingWebService, vero?

Il mio problema principale è che ho bisogno a portata di mano una serie di DataSources torna a SetItemDataSources, e SetItemDataSources soffoca su una serie di System.Objects, e non mi sembra di essere in grado di fusione a quello che voglio.

risposta

0

Se si dispone di un solo oggetto e si desidera passare un array di oggetti (cioè un array con un unico elemento in esso - il vostro unico oggetto), si utilizza la @() sintassi:

ps> $o = new-object mynamespace.myobj 
ps> $thing.Method(@($o)) 

-Oisin

2

Tutto ciò significa che la classe "DataSource" eredita direttamente da System.Object. Mentre "DataSourceReference" eredita da "DataSourceDefinitionOrReference", quindi forse qualcos'altro, quindi System.Object.

Tuttavia, non penso che sia il tuo problema. Il tuo problema è probabilmente la suddivisione e ricombinazione automatica delle raccolte di PowerShell come raccolte generiche di System.Object. Puoi controllare questo impostando un tipo statico sulla raccolta in questo modo (sto cercando di indovinare su questa API che stai utilizzando dal momento che non l'ho usato io stesso):

$computer = "rptdev" 
$uri = "http://$($computer)/ReportServer/ReportService.asmx?WSDL" 

$reporting = New-WebServiceProxy -uri $uri -UseDefaultCredential -namespace "ReportingWebService" 

[ReportingWebService.DataSource[]]$DataSources = <do something to get your data sources> 
$reporting.SetItemDataSources($DataSources)