我正在使用PowerShell 2.0.当我将一个新变量作为一个数组,然后将另一个变量设置为等于第一个变量时,第二个变量"镜像"第一个变量.更改原始数组中的对象后,第二个数组中将出现完全相同的更改.例如,
$array0001 = 6, 7, 3, 4, 0
$array0002 = $array0001
$array0001[3] = 55
$array0002
Run Code Online (Sandbox Code Playgroud)
输出是
6
7
3
55
0
Run Code Online (Sandbox Code Playgroud)
我注意到当你将第二个变量设置为与第一个变量具有相同的值时,除了包含在子表达式运算符中的时间之外,对第一个数组的修改不会影响第二个数组.例如,
$array0001 = 6, 7, 3, 4, 0
$array0002 = $($array0001)
$array0001[3] = 55
$array0002
Run Code Online (Sandbox Code Playgroud)
输出是
6
7
3
4
0
Run Code Online (Sandbox Code Playgroud)
为什么将值包含在子表达式运算符中会改变变量的行为?是否有另一种或更好的方法可以避免使数组变量相互"镜像"?
ETA:我现在已经发现$array0002 = @($array0001)并且$array0002 = &{$array0001}两者都达到了完全相同的目标.
我一直在撞墙挡在头上.
我知道如果我在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) …Run Code Online (Sandbox Code Playgroud)