PowerShell преобразует значения, возвращаемые функцией. Как этого избежать? - PullRequest
5 голосов
/ 30 марта 2009

Я пытаюсь вернуть List из функции PowerShell, но получаю одно из:

  1. ноль - для пустого списка
  2. System.Int32 - для списка с одним элементом
  3. System.Object [] - для списка с большим количеством элементов

Код:

function CreateClrList
{
    $list = New-Object "System.Collections.Generic.List``1[System.Int32]"
    $list.Add(3)
    $list
}

Write-Host (CreateClrList).GetType()

Ответы [ 3 ]

9 голосов
/ 30 марта 2009

Да, PowerShell разворачивает все коллекции. Одно из решений - вернуть коллекцию, содержащую реальную коллекцию, используя одинарную запятую:

function CreateClrList
{
    $list = New-Object "System.Collections.Generic.List``1[System.Int32]"
    $list.Add(3)
    ,$list
}
1 голос
/ 21 октября 2009

Обратите внимание, что большую часть времени вы хотите Powershell для развертывания перечислимых типов, чтобы команды по конвейеру выполнялись быстрее и с более ранней обратной связью с пользователем, поскольку команды по конвейеру могут начать обработку первых элементов и выдать вывод.

0 голосов
/ 19 октября 2012

Если вам нужно вернуть список целых чисел, используйте решение Яхимко .

В противном случае, если вам не особенно важно, что вы получаете - список или массив, а просто хотите перебрать результат, вы можете заключить результат в @ () при перечислении, например

$fooList = CreateClrList
foreach ($foo in @($fooList))
{
    ...
}

Это приведет к тому, что @($fooList) будет иметь тип массива - либо пустой массив, либо массив с одним элементом, либо массив с несколькими элементами.

...