3

私はこれで壁に頭をぶつけてきました。
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()" のようなものを使用して一度に 1 つのエントリを実行しようとすると、PS はこの場合 Clone を使用できないと文句を言います。

助言がありますか??

また、参考までに、2$a = PS |....行目は PS リスト オブジェクトへの参照型であるため、実際には必要ありません。実際に更新され、呼び出される$aたびに最新の値が返されます。$aここで何を達成しようとしているのかを明確にするために、これを含めました。

4

2 に答える 2

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 使用率の比較) については、より具体的なものがおそらくより良いでしょう。

于 2012-09-18T21:11:02.907 に答える
1

技術的$d = $cには、(参照または値の) 配列のコピーではありません。$c が参照する配列への参照を $d に隠しているだけです。Refreshプロセスの配列を一度取得してからメソッドを呼び出すだけでよいと思います。Exited関連するプロセスがまだ実行中であることを確認するには、最初にプロパティを確認する必要があります。もちろん、起動する新しいプロセスに興味がある場合、これは役に立ちません。その場合、異なる時点でのプロセスのスナップショットを取得し、2 つの配列間のプロセスの交差部分を除くすべてを (プロセス Id によって) 除外し、それらのプロパティ値の差を計算します (再びプロセス Id に基づいて)。これを簡単にするために、各スナップショットをプロセス ID をキーにしたハッシュテーブルに配置することをお勧めします。

于 2012-09-18T17:47:07.197 に答える