2011-10-20 18 views
9

Mam pewne problemy z tablicami dwuwymiarowymi w PowerShell. Oto, co chcę zrobić:Powershell: Tablica wielowymiarowa jako wartość zwracana funkcji

Tworzę funkcję, która ma zwrócić dwuwymiarową tablicę. Podczas wywoływania funkcji chcę, aby wartość zwracana była nową tablicą dwuwymiarową.

Dla lepszego zrozumienia dodałem funkcję przykład poniżej:

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 

Wyniki nie są, czego można oczekiwać. Chcę zwrócić informacje w taki sam sposób, jak zadeklarowano w funkcji. Tak więc oczekiwałbym, że $erg_array[0,1] dostarczy mi 2 zamiast 1,2 otrzymam z powyższym kodem. Jak mogę to osiągnąć?

+0

Dlaczego oczekujesz, że '$ erg_array [0,1] # result is 1 2'? Powinno to być '$ erg_array [0,1] # result 2', tak jak zdefiniowałeś, jest to jedna pozycja, nie 2. Tak więc nie jest całkiem jasne, co chcesz osiągnąć. Próbujesz dostać coś, co nie istnieje. –

+0

Albo cel powinien zostać zmieniony, albo środki, np. możemy próbować użyć nie tablicy 2-dim, ale czegoś innego. –

Odpowiedz

10

W celu przywrócenia tablicy dokładnie tak, jak to jest bez „rozwijania” użyć operatora przecinek (patrz 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 

, tworzy tablicę z jednej pozycji (co jest nasza tablica). Ta 1-elementowa tablica zostaje rozwinięta po powrocie, ale tylko jeden poziom, tak, że wynikiem jest dokładnie jeden obiekt, nasza tablica. Bez naszej własnej struktury rozwijana jest jego zawartość, a nie tablica. Technika ta z użyciem przecinka przy powrocie powinna być również używana z niektórymi innymi kolekcjami (jeśli chcemy zwrócić instancję kolekcji, a nie jej elementy).

3

To, czego naprawdę brakuje w tym porcie, jest tym, czego wszyscy szukają. Jak uzyskać więcej niż jedną rzecz z funkcji. Cóż, zamierzam podzielić się tym, co każdy chce wiedzieć, kto przeszukał i znalazł to, mając nadzieję, że odpowie na to pytanie.

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”}