Arrays 深度复制数组
这一次我的头撞到了墙上。Arrays 深度复制数组,arrays,powershell,Arrays,Powershell,这一次我的头撞到了墙上。 我知道,如果我在Powershell中创建一个数组,然后复制该数组,它将作为引用类型而不是值类型进行复制。 因此,经典的例子是: $c = (0,0,0) $d = $c $c[0] = 1 $d 1 0 0 解决方案是执行$d=$c.clone() 但是,如果数组本身是引用类型的集合,则这不起作用。这是我的问题。我试图创建一个数组来跟踪CPU使用情况,方法是创建一个进程数组,等待一段时间,然后检查最新的值并计算差异。但是,Get进程会创建一个引用数组。因此,当我执行
我知道,如果我在Powershell中创建一个数组,然后复制该数组,它将作为引用类型而不是值类型进行复制。
因此,经典的例子是:
$c = (0,0,0)
$d = $c
$c[0] = 1
$d
1
0
0
解决方案是执行$d=$c.clone()
但是,如果数组本身是引用类型的集合,则这不起作用。这是我的问题。我试图创建一个数组来跟踪CPU使用情况,方法是创建一个进程数组,等待一段时间,然后检查最新的值并计算差异。但是,Get进程会创建一个引用数组。因此,当我执行以下操作时:
$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
$c = (0,0,0)
$d = $c | foreach { $_ }
$c[0] = 1
"c is [$c]"
"d is [$d]"
$a
和$b
将始终返回相同的值。如果我尝试使用类似于$b[0]=“$a[0].clone()”,一次只执行一个条目,则PS会抱怨在这种情况下无法使用克隆
有什么建议吗
另外,仅供参考,第二行
$a=PS |..
实际上并不需要,因为$a
是PS list对象的引用类型,它实际上会得到更新,并在调用$a
时返回最新的值。我加入它是为了更清楚地说明我在这里要实现的目标。从技术上讲,$d=$c
不是任何类型的数组副本(参考或价值)。它只是将对$c引用的数组的引用隐藏到$d中。我认为您只需要获取一次进程数组,然后调用Refresh
方法。您必须首先检查Exited
属性,以确保关联的进程仍在运行。当然,如果您对任何新启动的流程感兴趣,这对您没有帮助。在这种情况下,在不同的时间抓取进程的快照,除去两个数组(按进程Id)之间进程的交集以外的所有进程,然后计算它们的属性值的差异-同样基于进程Id。采取更简单的方法,您可能希望将每个快照放在一个哈希表中,该哈希表不包含进程Id。要复制数组,可以执行以下操作:
$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
$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所指出的,更具体的方法可能会更好。Ahhh,当然。好电话。实际上,我只需要ID和CPU的值。因此,我可以使用foreach($\in$psCurrentList){$psPreviousList.add($\u.id,$\u.cpu)}将它们转储到一个哈希表中,谢谢。当数组的元素是对对象的引用时,您也可以使用它
$d=$c |%{$\u}
仍然将对对象的引用复制到$d,因此当您更改$c[0]中元素的属性时,您会看到$d中的更改。