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的值。为什么它也会更改$ListeGroupe$Grp0的值?

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

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

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

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

CCD_ 5指向与CCD_ 6相同的对象。对其中一个的更改会影响另一个。

解决这一问题的一种可能方法是在PSObject上使用Copy()方法。

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

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

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

我来尝试你的代码:

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

我有这个(抱歉是法语的(:

Échec lors de l’appel de la méthode, car [System.Management.Automation.PSCustomObject] ne contient pas de méthode nommée « Copy ».
_Failed to call the method, because [System.Management.Automation.PSCustomObject] does not contain a method named "Copy"_
Au caractère Ligne:2 : 1
+ $b = $a.Copy()
+ ~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation : (Copy:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

我的错误在哪里?谢谢

最新更新