【发布时间】:2019-05-02 01:06:57
【问题描述】:
我有一个变量,它通过我更新不同变量的值来改变它的值。
我正在尝试创建自己的对象并尝试使用我在网上找到的一些代码,我偶然发现了这个问题,无法理解这是如何发生的。
准备工作:
$a = "" | select First,Last #This just creates a custom object with two columns.
$b = @() #This is just an empty array to fill later on with the values of '$A'
$a.first = "Alpha"
$a.last = "Bravo"
$b += $a
$a.first = "Charlie"
$a.last = "Delta"
$b += $a
应该发生什么:
第一个 最后一个 ----- ---- 阿尔法布拉沃 查理三角洲但实际结果是:
第一个 最后一个 ----- ---- 查理三角洲 查理三角洲这里有什么问题?
【问题讨论】:
-
您没有添加
$A的副本 ...您正在添加对$A的引用。[grin] 所以当它更改 references 时指向它也会改变。使用.Clone()或制作新对象以添加到您的收藏中。 -
我不会亲自使用克隆,我会在对象中创建自己的克隆方法,该方法从旧对象中初始化的值构造一个新对象并返回该新对象。根据我在旧计算机科学课程中学到的知识
.Clone()不一定会做深拷贝……但也不一定会做浅拷贝。 -
@Lee_Dailey 在自定义对象中没有 .clone 方法。您还可以解释一下制作新对象的意思吗?我问是因为我使用自定义对象而不是数组来存储集合,但它也将第一个对象存储为参考。
-
@Yeahish - 我忘记了自定义对象没有
.Copy()或.Clone()方法。 [blush] 在这种情况下,您每次都需要制作一个新的。因为Select-Object方法是SLOW,你可能会使用正确的方法=[PSCustomObject]@{}。 -
@Yeahish - Select-Object 方法涉及更多代码,可以处理许多不同的用例。另外,它需要一个人通过管道发送东西......这总是比更直接的方法慢。
PSCO技术更简单,因为它专门用于制作对象并且不需要使用管道。
标签: powershell