深层复制数组

Eta*_*vad 3 arrays powershell

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

$c = (0,0,0)
$d = $c
$c[0] = 1
$d
1
0
0
Run Code Online (Sandbox Code Playgroud)

解决方案是这样做$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
Run Code Online (Sandbox Code Playgroud)

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

有什么建议??

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

lat*_*kin 5

要复制阵列,您可以执行以下操作:

$c = (0,0,0)
$d = $c | foreach { $_ }
$c[0] = 1
"c is [$c]"
"d is [$d]"
Run Code Online (Sandbox Code Playgroud)

结果

c is [1 0 0]
d is [0 0 0]
Run Code Online (Sandbox Code Playgroud)

对于您的特定问题(比较进程的CPU使用率),更具体的内容可能会更好,正如Keith指出的那样.

  • 当数组的元素是对象的引用时,这不起作用。`$d=$c|%{$_}` 仍然会将对象的引用复制到 $d,因此当您更改 $c[0] 中元素的属性时,您会看到 $d 中的更改。 (2认同)