【问题标题】:Defining a powershell variable from a CSV that can be edited independently从可独立编辑的 CSV 定义 powershell 变量
【发布时间】:2018-08-30 23:59:34
【问题描述】:

我在 Powershell 4.0 中使用 Import-Csv 导入 CSV,目的是添加具有变体的重复行。假设 $data 是一个包含 CSV 的变量,这是我打印时的输出:-

PS C:> $data

Var1           Var2           Var3           Var4                                          

----           ----           ----           ----                                          

Ans1           Ans2           Ans3           Ans4

然后我创建该行的副本:-

PS C:>$firstRow = $data[0]

理论上,我会修改 $firstRow 并将其作为新行重新添加:-

$firstRow.Var1 = 'TEST'

这就是有趣的地方。像我上面那样修改变量也修改了原始变量:-

PS C:> $data

Var1           Var2           Var3           Var4                                          

----           ----           ----           ----                                          

TEST           Ans2           Ans3           Ans4

谷歌搜索并没有真正阐明这一点。我还注意到,当变量是标准变量(例如字符串、整数等)时,不会发生这种情况。

有人知道这个问题的解决方法吗?或者如果在这种特定情况下发生这种情况是有原因的?

亲切的问候, 本

【问题讨论】:

  • 这就是数组在 .NET 中的工作方式 - $firstRow 确实拥有与 $data[0] 相同的对象的引用

标签: powershell csv variables


【解决方案1】:

这种方法在完成你想要的事情方面效率不高,但它会起作用。

$firstRow = new-object psobject
$data[0].psobject.properties | ForEach-Object {
    $firstRow | Add-Member -MemberType $_.MemberType -Name $_.Name -Value $_.Value
}
$firstRow.Var1 = 'TEST'

基本上它只是逐个属性循环并将$data的第一行克隆到$firstRow

参考:How to create new clone instance of PSObject object

编辑感谢 TheMadTechnician,psobject Copy 方法可以在这种情况下使用

$firstRow = $data[0].psobject.Copy()
$firstRow.Var1 = 'TEST'

【讨论】:

  • 该链接中最受欢迎的答案确实有效。你可以做$firstRow = $data[0].psobject.copy(),它工作得很好。
  • 哦,我在做$data[0].copy()哈哈那我会更新我的答案!
  • 这真的很清楚,谢谢!所以只是澄清一下,实现它的最佳方法是创建一个新对象,它是重复对象还是原始对象?
  • @BenRoberts 是的,因为默认情况下 pwershell 只是在涉及对象时通过引用分配
猜你喜欢
  • 2011-06-15
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多