2017-04-25 4 views
2

제목이 분명하지 않으며 그 사실을 사과드립니다. 나는 쓰고있는 스크립트로 약간의 문제를 겪었고 무슨 일이 일어나고 있는지 알아내는 데 도움이되기를 바라고있다. 문제를 해결하는 방법을 알아 냈습니다. 을 찾으십니까?이 문제가 발생했습니다. 스크립트의 길이는 3k 줄을 넘었지만, 아래에 쓴 스크립트는 같은 문제를 재현합니다.루프 외부의 두 번째 해시 테이블에서 PowerShell 해시 테이블 값이 제거됨

세 개의 해시 테이블, DeviceList, AllDevices 및 RemovedDevices가 있습니다. Devicelist는 명시 적으로 배치되고 AllDevices는 DeviceList와 같습니다. 루프 내에서 RemovedDevices에있는 항목은 DeviceList에서 제거됩니다. 이 샘플에서는 AllDevices가 처음 수정되었을지라도 장치는 여전히이 장치에서 제거됩니다. 위의 텍스트를 실행

$DeviceList = @{"server1" = "email1"; "server2" = "email2"; "server3" = "email3"} 
$AllDevices = $DeviceList 
$RemovedDevices = @{"server1" = "email1"; "server2" = "email2"} 

foreach($RemovedDevice in $RemovedDevices.GetEnumerator()) 
    { 
    $DeviceList | where {$_.ContainsKey($RemovedDevice.Key)} | % {$_.Remove($RemovedDevice.Key)} 
    } 
$AllDevices 

은 $ AllDevices는 여전히 3 개 서버를 포함해야하는 서버 3 정보를 포함하도록 수정됩니다.

내가 두 번째 줄을 수정하는 경우 :

$AllDevices += $DeviceList 

그런 다음 AllDevices는 3 개 값을 유지합니다. 중단 점을 사용하고 첫 번째 버전을 단계별로 실행하면서 처음으로 AllDevices가 적중하지 않았 음을 확인했습니다.

내 전반적인 질문은 다음과 같습니다. 루프가 완료된 후 AllDevices가 DeviceList와 동일한 것으로 수정되는 이유는 무엇입니까? 처음에 한 번만 호출되면 DeviceList를 수정해도 값이 정적으로 유지되지 않아야합니까? 유사한 방법을 사용하여 배열을 재구성해도 AllDevices를 덮어 쓰지 않으므로 해시 테이블과 유사합니다.

PSVersion 루프가 완료된 후가 동일 AllDevices DeviceList로 수정되는 이유 5.0.10586.117

답변

4

? 그것은 단지 시작에 한 번이라고하면 $AllDevices 때문에

가되지는 값이 수정 DeviceList하기에도 불구하고 정적 남아의 경우, $DeviceList

과 같은 기본 객체에 불과 참조입니까?

는 모르겠지만, 그냥 동등한 동일 대상이 아닌 $AllDevices이 경우 - 그것은 같은 객체입니다.

다행히, 얕은 해시 테이블을 위해, 당신은 Clone() 방법을 사용할 수 있도록 ICloneable 인터페이스를 구현 해시 테이블 : 내가 함께 해시 테이블의 사용을 발견

$DeviceList = @{"server1" = "email1"; "server2" = "email2"; "server3" = "email3"} 
$AllDevices = $DeviceList.Clone() 

$RemovedDevices = @{"server1" = "email1"; "server2" = "email2"} 

foreach($RemovedDevice in $RemovedDevices.GetEnumerator()) 
{ 
    if($DeviceList.ContainsKey($RemovedDevice.Key)) 
    { 
     $DeviceList.Remove($RemovedDevice.Key) 
    } 
} 
$AllDevices 

Where-Object 슈퍼 읽을 수 (불필요하게 느린 언급하지 않기 위하여) 기능적으로 위의 내용은 원래 foreach 루프 본문과 동일합니다.

+0

그런 식으로하면 레퍼런스 일뿐 별개의 개체가 아닙니다. 귀하의 설명에 진심으로 감사드립니다! – Nick