Заставьте PowerShell думать, что объект не перечисляем - PullRequest
10 голосов
/ 14 октября 2010

Я работал над некоторыми функциями PowerShell для управления объектами, реализованными в сборке, которую мы создали.Один из классов, с которыми я работал, реализует IEnumerable.К сожалению, это заставляет PowerShell развертывать объект при каждой возможности.(Я не могу изменить тот факт, что класс реализует IEnumerable.)

Я обошел проблему, создав PSObject и скопировав свойства нашего пользовательского объекта в PSObject, а затем возвратив его вместопользовательский объект.Но я бы действительно предпочел вернуть наш пользовательский объект.

Есть ли какой-то способ, предположительно используя мой файл types.ps1xml, чтобы скрыть метод GetEnumerator () этого класса от PowerShell (или иначе сказать PowerShell никогда не развертыватьэто).

Ответы [ 2 ]

8 голосов
/ 14 октября 2010

Упаковка в PSObject, вероятно, лучший способ.

Вы также можете явно обернуть его в другой коллекции - PowerShell разворачивает только один уровень.

Также при написании командлета в C # / VB / ... при вызове WriteObject используется перегрузка, которая принимает второй параметр: если false, то PowerShell не будет перечислять объект, переданный в качестве первого параметр.

5 голосов
/ 14 октября 2010

Проверьте замену Write-Output http://poshcode.org/2300, которая имеет параметр -AsCollection, позволяющий избежать развертывания.Но в основном, если вы пишете функцию, которая выводит коллекцию, и вы не хотите, чтобы эта коллекция развернулась, вам нужно использовать CmdletBinding и PSCmdlet:

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

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

Если вы вызываете это с -AsCollection,Результаты получатся совсем другие, хотя они будут СМОТРЕТЬ ЖЕ в консоли.

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   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...