2010-10-14 15 views
10

Ho lavorato su alcune funzioni di PowerShell per gestire gli oggetti implementati in un assembly che abbiamo creato. Una delle classi con cui ho lavorato è IEnumerable. Sfortunatamente, questo fa sì che PowerShell srotoli l'oggetto in ogni occasione. (Non posso cambiare il fatto che la classe implementa IEnumerable.)Fai in modo che PowerShell pensi che un oggetto non sia enumerabile

Ho risolto il problema creando un oggetto PSO e copiando le proprietà del nostro oggetto personalizzato su PSObject, restituendole invece dell'oggetto personalizzato . Ma preferirei davvero restituire il nostro oggetto personalizzato.

C'è un modo, presumibilmente, usando il mio file types.ps1xml, per nascondere il metodo GetEnumerator() di questa classe da PowerShell (o altrimenti dire a PowerShell di non srotolarlo mai).

+1

Quindi si dispone di una classe di raccolta personalizzata e non si desidera che PowerShell lo tratti come una raccolta? – rerun

+1

Sì, è praticamente tutto. La classe ha cose diverse dalla collezione. Per favore non lasciare che questo diventi una discussione sul (de) merito se questa classe debba o meno essere enumerabile. – OldFart

risposta

8

Avvolgere in un PSObject è probabilmente il modo migliore.

È anche possibile includerlo in modo esplicito in un'altra raccolta — PowerShell scartina solo un livello.

Anche quando si scrive un cmdlet in C#/VB/... quando si chiama WriteObject si utilizza il sovraccarico che utilizza un secondo parametro: se false, allora PowerShell non enumera l'oggetto passato come primo parametro.

5

Controllare la sostituzione di scrittura-scrittura http://poshcode.org/2300 che ha un parametro -AsCollection che consente di evitare lo srotolamento. Ma in fondo, se si sta scrivendo una funzione che emette una collezione, e non si vuole che la raccolta srotolato, è necessario utilizzare CmdletBinding e PSCmdlet:

function Get-Array { 
    [CmdletBinding()] 
    Param([Switch]$AsCollection) 

    [String[]]$data = "one","two","three","four" 
    if($AsCollection) { 
     $PSCmdlet.WriteObject($data,$false) 
    } else { 
     Write-Output $data 
    } 
} 

se si chiama che con -AsCollection sarete ottenere risultati molto diversi, anche se GUARDA LO STESSO nella console.

C:\PS> Get-Array 

one 
two 
three 
four 

C:\PS> Get-Array -AsCollection 

one 
two 
three 
four 

C:\PS> Get-Array -AsCollection| % { $_.GetType() } 


IsPublic IsSerial Name  BaseType        
-------- -------- ----  --------        
True  True  String[] System.Array       



C:\PS> Get-Array | % { $_.GetType() } 


IsPublic IsSerial Name  BaseType        
-------- -------- ----  --------        
True  True  String  System.Object       
True  True  String  System.Object       
True  True  String  System.Object       
True  True  String  System.Object 
+0

Il problema è che voglio evitare di averlo srotolato MAI. Posso restituire l'oggetto dalla mia funzione senza srotolarlo usando il trucco return-as-array (o ciò che descrivi). Ma alla fine finirò per srotolarlo per sbaglio. – OldFart

+3

In poche parole: non conosco alcun modo per farlo, ma per favore non provare :) ... Se trovi un modo in cui finirai per causare una serie di segnalazioni di bug da parte di persone incapaci di capire perché il tuo la collezione non ha nulla in essa, anche se .Count riporta un bel numero grande. – Jaykul

Problemi correlati