2009-06-23 8 views
5

Je suis nouveau à l'utilisation web services sous powershell, alors peut-être que j'ai un malentendu de base à propos de quelque chose. Je travaille avec Microsoft Reporting Services. Voici un script de repro.Powershell, les services Web et les types d'objet

$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() 

Si je cours, j'obtenir quelque chose qui ressemble plus ou moins comme ceci:

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

Alors, ma question est: Pourquoi DataSource a System.Object comme BaseType quand DataSourceReference a clairement un objet type qui est basé sur l'objet Web? Ils ont tous deux été créés à partir de l'espace de noms ReportingWebService, n'est-ce pas?

Mon problème racine est que je dois remettre un tableau de DataSources retour à SetItemDataSources et SetItemDataSources selfs sur un tableau de System.Objects, et je ne semble pas être en mesure de casting à ce que je veux.

Répondre

0

Si vous avez seulement un seul objet et que vous voulez passer un tableau d'objets (par exemple un tableau avec un seul élément en elle - votre seul objet), vous utilisez le @() Syntaxe:

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

-Oisin

2

Tout cela signifie que la classe "DataSource" hérite directement de System.Object. Considérant que "DataSourceReference" hérite de "DataSourceDefinitionOrReference", alors peut-être quelque chose d'autre, puis System.Object.

Cependant, je ne pense pas que ce soit votre problème. Votre problème est probablement le fractionnement automatique et la recombinaison des collections de PowerShell en tant que collections génériques de System.Object. Vous pouvez contrôler cela en définissant un type statique sur la collection comme ceci (je devine sur cette API que vous utilisez puisque je ne l'ai pas utilisée moi-même):

$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) 
Questions connexes