Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 深度复制数组_Arrays_Powershell - Fatal编程技术网

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中的更改。