Powershell: многомерный массив как возвращаемое значение функции - PullRequest
9 голосов
/ 20 октября 2011

У меня есть некоторые проблемы с двумерными массивами в PowerShell. Вот что я хочу сделать:

Я создаю функцию, которая должна возвращать двумерный массив. При вызове функции я хочу, чтобы возвращаемое значение было новым двумерным массивом.

Для лучшего понимания я добавил ниже пример функции:

function fillArray() {
    $array = New-Object 'object[,]' 2,3

    $array[0,0] = 1
    $array[0,1] = 2
    $array[0,2] = 3

    $array[1,0] = 4
    $array[1,1] = 5
    $array[1,2] = 6

    return $array
}
$erg_array = New-Object 'object[,]' 2,3
$erg_array = fillArray

$erg_array[0,1] # result is 1 2
$erg_array[0,2] # result is 1 3
$erg_array[1,0] # result is 2 1

Результаты не те, что я ожидаю. Я хочу вернуть информацию так же, как объявлено в функции. Поэтому я ожидаю, что $erg_array[0,1] даст мне 2 вместо 1,2, который я получу с кодом выше. Как мне этого добиться?

Ответы [ 2 ]

10 голосов
/ 20 октября 2011

Чтобы вернуть массив в точности так, как он есть, без «развёртывания», используйте оператор запятой (см. help about_operators)

function fillArray() {
    $array = New-Object 'object[,]' 2, 3

    $array[0,0] = 1
    $array[0,1] = 2
    $array[0,2] = 3

    $array[1,0] = 4
    $array[1,1] = 5
    $array[1,2] = 6

    , $array # 'return' is not a mistake but it is not needed
}

# get the array (we do not have to use New-Object now)
$erg_array = fillArray

$erg_array[0,1] # result is 2, correct
$erg_array[0,2] # result is 3, correct
$erg_array[1,0] # result is 4, correct

, создает массив с одним элементом (который является нашим массивом). Этот массив из 1 элемента возвращается по возвращении, но только на один уровень, так что в результате получается ровно один объект - наш массив. Без , наш массив развернут, возвращаются его элементы, а не массив. Эту технику с использованием запятой при возврате следует использовать и с некоторыми другими коллекциями (если мы хотим вернуть экземпляр коллекции, а не ее элементы).

3 голосов
/ 09 августа 2012

Чего действительно не хватает в этом порту, это то, что все ищут.Как получить более чем одну вещь из функции.Ну, я собираюсь поделиться тем, что каждый хочет знать, кто искал и нашел это, надеясь, что он ответит на вопрос.

function My-Function([string]$IfYouWant)
{
[hashtable]$Return = @{} 

$Return.Success = $False
$Return.date = get-date
$Return.Computer = Get-Host

Return $Return
}
#End Function

$GetItOut = My-Function
Write-host “The Process was $($GetItOut.Success) on the date $($GetItOut.date) on the     host     $($GetItOut.Computer)”

#You could then do
$var1 = $GetItOut.Success
$Var2 =$GetItOut.date
$Var3 = $GetItOut.Computer

If ($var1 –like “True”){write-host “Its True, Its True”}
...