2011-10-20 4 views
9

PowerShell에서 2 차원 배열에 몇 가지 문제가 있습니다. 다음은 내가 원하는 작업입니다.Powershell : 함수의 반환 값으로 다차원 배열

2 차원 배열을 반환하는 함수를 만듭니다. 함수를 호출 할 때 반환 값을 새로운 2 차원 배열로 원합니다. 나는 아래, 예를 들어 기능을 추가 한 더 나은 이해를 위해

:

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]이 대신에 1,2을 줄 것을 기대할 것입니다. 이것을 어떻게 할 수 있습니까? 콤마 연산자를 사용하여 "풀림"없이 그것이 정확하게 배열을 리턴하기 위해

+0

왜'$ erg_array [0,1] # result is 1 2'를 기대합니까? '$ erg_array [0,1] # result 2'이어야합니다. 정의한대로, 이것은 하나의 항목이지 2가 아닙니다. 그래서 당신이 얻고 자하는 것이 명확하지 않습니다. 당신은 존재하지 않는 것을 얻기 위해 노력하고 있습니다. –

+0

목표를 수정해야합니다. 2 차원 어레이가 아닌 다른 것을 사용하려고 할 수 있습니다. –

답변

10

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 

,는 (로모 배열) 단품 배열을 생성 (help about_operators 참조). 이 1 항목 배열은 결과가 정확히 하나의 객체 인 배열이되도록 반환 할 때 하나의 수준에서만 전개됩니다. ,이 없으면 배열 자체가 전개되고 배열이 아닌 항목이 리턴됩니다. 반환시 쉼표를 사용하는이 기술은 다른 컬렉션에서도 사용해야합니다 (항목이 아닌 컬렉션 인스턴스를 반환하려는 경우).

3

이 포트에 실제로없는 것은 모두가 찾고있는 것입니다. 함수에서 둘 이상을 얻는 방법. 글쎄, 나는 모두가 누구를 찾고 싶어 하는지를 공유 할 것이고, 이것이 누가 그 질문에 대답하기를 희망하면서 이것을 발견했다.

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