Powershell数组赋值赋值变量,而不是值?

时间:2012-01-09 06:03:16

标签: arrays powershell variable-assignment

我有一个创建数组的程序示例,然后尝试将该数组的值多次分配到另一个数组中作为多维数组。

$a =@(0,0,0)
$b = @($a,$a,$a)
$b[1][2]=2
$b
'And $a is changed too:'
$a

输出结果为:

PS E:\Workarea> .\what.ps1
0
0
2
0
0
2
0
0
2
And $a is changed too:
0
0
2

所以在这个例子中,变量实际上指向原始变量。这是非常意外的行为。虽然我从来没有在C编程中使用过很多工会,但是人们可以做到这一点相当简洁。但我想要一种方法来实际分配值,而不是变量。

$b = @($a.clone(),$a.clone(),$a.clone())

我想会起作用,但有些东西告诉我,可能会有一些比这更优雅的东西。

感谢您的投入。

这是Windows 7 64位下的PowerShell 2.0。

2 个答案:

答案 0 :(得分:4)

要将$a的值指定为$b而不是$a的引用,您可以将变量包装在$()中。在$()中的任何内容在命令中使用之前都会得到评估,因此$($a)等同于0, 0, 0

$a =@(0,0,0)
$b = @($($a),$($a),$($a))
$b[1][2]=2
$b
'$a is not changed.'
$a

答案 1 :(得分:1)

在PowerShell中要小心','不是枚举器运算符,而是数组运算符。你作为多维数组呈现的东西实际上是一个数组数组,你可以在多维数组的定义下找到它:

$a= new-object ‘object[,]’ 3,3
$a[0,2]=3 
PS > for ($i=0;$i -lt 3;$i++)
>> {
>> for($j=0;$j -lt 3;$j++)
>> {
>> $a[$i,$j]=$i+$j
>> }
>> }

这里的所有内容都是$b,是一个引用数组。