2011-10-20 42 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]を私に渡すと思います。どうすればこれを達成できますか?

+0

なぜ、 '$ erg_array [0,1]#result is 1 2'を期待していますか? '$ erg_array [0,1]#result 2'でなければなりません。あなたが定義したのと同じように、これは1つの項目であり、2ではありません。あなたは存在しないものを手に入れようとしています。 –

+0

目標を修正するか、手段などを修正する必要があります。私たちは2次元配列ではなく他のものを使用しようとすることができます。 –

答えて

10

それはカンマ演算子を使用し、「アンローリング」することなくそのまま正確アレイを戻すために(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項目の配列は返されたときに展開されますが、結果は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”}