Powershell - Странный возврат значения переменной - PullRequest
0 голосов
/ 28 октября 2019

У меня (для меня) странный результат со скриптом. Это сводка моего скрипта, который возвращает тот же результат:

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

Ответы [ 2 ]

1 голос
/ 28 октября 2019

В Powershell объекты (например, значение в $Grp0) обрабатываются как ссылки. Таким образом, присвоение переменной существующему объекту дает вам - не новый объект - но другую ссылку на тот же объект.

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

$b указывает на тот же объект, что и $a. Изменения одного влияют на другое.

Один из возможных способов обойти это - использовать метод Copy() для PSObject.

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

Now, $a и $b указывают на разные объекты, и изменения одного не повлияют на другие.

Обратите внимание, что Copy() делает только мелкую копию.

0 голосов
/ 29 октября 2019

Я пришел, чтобы попробовать ваш код:

$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

Где моя ошибка? спасибо

...