有许多函数添加到相同的数组变量

时间:2013-10-02 17:42:35

标签: variables powershell scoping

我有一些类似于下面的伪代码

$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中的范围界定方式非常不熟悉。

1 个答案:

答案 0 :(得分: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。