深层复制数组

时间:2012-09-18 17:07:09

标签: arrays powershell

我一直在撞墙挡在头上 我知道如果我在Powershell中创建一个数组,然后复制数组,它会将其复制为引用类型而不是值类型。
所以,经典的例子是:

$c = (0,0,0)
$d = $c
$c[0] = 1
$d
1
0
0

解决方案是$d = $c.clone() 如果数组本身是引用类型的集合,则这不起作用。这是我的问题。我正在尝试通过创建进程数组来创建一个跟踪CPU使用情况的数组,等待一段时间,然后检查最新值并计算差异。但是,Get-Process会创建一个引用数组。所以当我做以下事情时:

$a = ps | sort -desc id | where-object {$_.CPU -gt 20} #Get current values
$b = $a.clone() #Create a copy of those values.
sleep 20 #Wait a few seconds for general CPU usage...

$a = ps | sort -desc id | where-object {$_.CPU -gt 20} #Get latest values.
$a[0]  
$b[0] #returns the same value as A.

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessNam
-------  ------    -----      ----- -----   ------     -- ----------
   3195      57    90336     100136   600    83.71   7244 OUTLOOK

$a$b将始终返回相同的值。如果我尝试使用类似$ b [0] =“$ a [0] .clone()”的方式一次输入一个条目 - PS抱怨在这种情况下无法使用克隆。

有什么建议吗?

另外,仅仅是FYI,实际上并不需要第二行$a = PS |....,因为$a是PS列表对象的引用类型,它实际上会更新并返回最新值{{1 }} 叫做。我把它包括在内是为了让我更清楚我在这里想要完成的事情。

1 个答案:

答案 0 :(得分:5)

要复制数组,您可以执行以下操作:

$c = (0,0,0)
$d = $c | foreach { $_ }
$c[0] = 1
"c is [$c]"
"d is [$d]"

结果

c is [1 0 0]
d is [0 0 0]

对于你的特定问题(比较进程的CPU使用率),Keith指出,更具体的东西可能会更好。