我一直在撞墙挡在头上
我知道如果我在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 }} 叫做。我把它包括在内是为了让我更清楚我在这里想要完成的事情。
答案 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指出,更具体的东西可能会更好。