0

以下のような疑似コードがあります

$funcValues = @(New-Object -TypeName psobject -Property @{'Function' = ''; 'Value' = '';}) 

function func1(){
    while($i -lt 5){
        $funcValues += @(New-Object -TypeName psobject -Property @{'Function' = 'func1'; 'Value' = $i;}) 
        $i++
    }
}

function func2(){
    while($i -lt 3){
        $funcValues += @(New-Object -TypeName psobject -Property @{'Function' = 'func2'; 'Value' = $i;}) 
        $i++
    }
}

func1
func2

$funcValues | Export-CSV C:\path\results.csv -noType

目標は、両方の関数を配列に追加し、関数を呼び出した後に配列を csv にエクスポートすることです。ただし、このコードが関数内にある場合、配列には何も書き込まれませんが、コードが関数の外にある場合は機能します。

これは変数のスコープに関係していると思いますが、powershell でスコープがどのように機能するかについてはよくわかりません。

4

1 に答える 1

1

あなたの推測は正しいです。試す:

function func1(){
    while($i -lt 5){
        $script:funcValues += @(New-Object -TypeName psobject -Property @{'Function' = 'func1'; 'Value' = $i;}) 
        $i++
    }
}

配列の配列を作成していることに注意してください。それがあなたが望んでいたものでない場合は、次を使用してください:

$script:funcValues += New-Object -TypeName psobject -Property @{'Function' = 'func1'; 'Value' = $i;}

V3 を使用している場合は、さらに単純化できます。

$script:funcValues += [pscustomobject]@{'Function' = 'func1'; 'Value' = $i;}

コードに関する最後のコメント - 配列で += を使用するのはあまり高速ではありません。配列はサイズ変更できないため、 += は新しい配列を作成し、元の配列から要素をコピーして最後に要素を追加します。配列が小さい場合、構文は明確で便利ですが、配列が大きくなりパフォーマンスが問題になる場合は、ArrayList などの別のデータ構造の使用を検討してください。

于 2013-10-02T18:32:11.083 に答える