首页 > 解决方案 > Powershell - 奇怪的变量值返回

问题描述

我有一个(对我来说)奇怪的脚本结果。这是我的脚本的摘要,它返回相同的结果:

cls
$Init          = "AFFAIRES"
$ListeGroupes  = @() 
$NomGrScan     = "AFFAIRES"
$Grp0          = New-Object psobject
$Grp0          | Add-Member -Name "Nom"  -MemberType NoteProperty -value $Init
$Grp0          | Add-Member -Name "Scan" -MemberType NoteProperty -value "N"
$ListeGroupes += $Grp0 
$LGroupes1     = @()
$LGroupes1    += $ListeGroupes
write-host "Grp0 : $($Grp0.Nom) - $($Grp0.scan)"
write-host "ListeGroupes : $($ListeGroupes.Nom) - $($ListeGroupes.scan)"
write-host "LGroupes1 : $($LGroupes1.Nom) - $($LGroupes1.scan)"
($LGroupes1 | where {$_.nom -eq "$NomGrScan"}).scan = "O"
write-host "============================================="
write-host "Grp0 : $($Grp0.Nom) - $($Grp0.scan)"
write-host "ListeGroupes : $($ListeGroupes.Nom) - $($ListeGroupes.scan)"
write-host "LGroupes1 : $($LGroupes1.Nom) - $($LGroupes1.scan)"

当我在我的电脑上运行它时,我得到:

Grp0 : AFFAIRES - N
ListeGroupes : AFFAIRES - N
LGroupes1 : AFFAIRES - N
=============================================
Grp0 : AFFAIRES - O
ListeGroupes : AFFAIRES - O
LGroupes1 : AFFAIRES - O

在脚本的第 15 行,我只更改$LGroupe1. 为什么它也会改变$ListeGroupeand的值$Grp0

我不明白为什么我没有得到:

Grp0 : AFFAIRES - N
ListeGroupes : AFFAIRES - N
LGroupes1 : AFFAIRES - N
=============================================
Grp0 : AFFAIRES - N
ListeGroupes : AFFAIRES - N
LGroupes1 : AFFAIRES - O

标签: powershellreturn-value

解决方案


在 Powershell 中,对象(如 中的值$Grp0)被视为引用。因此,将变量分配给现有对象会得到您 - 不是新对象 - 而是对同一对象的另一个引用。

$a = New-Object PSObject -Property @{ prop1='a' ; prop2='b' }
$b = $a

$b指向与 相同的对象$a。对一个的更改会影响另一个。

解决此问题的一种可能方法是使用Copy()方法 on PSObject

$a = New-Object PSObject -Property @{ prop1='a' ; prop2='b' }
$b = $a.PSObject.Copy()

现在,$a$b指向不同的对象,并且对其中一个的更改不会影响另一个。

请注意,Copy()仅执行浅拷贝。


推荐阅读