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 回答