我一直在撞墙挡在头上.
我知道如果我在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调用时返回最新的值.我把它包括在内,以便更清楚我在这里想要完成的事情.
要复制阵列,您可以执行以下操作:
$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指出的那样.
| 归档时间: |
|
| 查看次数: |
6757 次 |
| 最近记录: |