2017-11-01 7 views
2

JSON을 참조로 전달한 다음 그 내용을 추가하려고합니다. $json.commontokens.search.tokens.token를 구축 (키가 알 수없는 변경 수 있기 때문에) $json.commontokens.search.tokens.token += $newItem참조로 전달하는 powershell

내가 $jsonList에서 문자열 목록에 $json 다음 키를 계속 :

예를 들어, 나는 같은 일 같은 싶어
$jPath = $json 
    foreach($item in $jsonList){ 
     $jPath = $jPath.$item 
    } 

결과적으로 $jpath += $newItem은 변경 사항을 $json으로 유지하지 않습니다 (그러나 $jpath에서 작동 함). 그래서 나는 변화를 지키기 위해 참조로 전달해야한다고 생각했습니다.

function adder{ 
    param(
     [ref]$j 
     $stringList 
    ) 
    if ($stringList -ne $null) { 
     $first = $stringList.first.value 
     $stringList.removefirst() 
     adder ([ref]$j.value.$first) $stringList 
    } else { 
     return $j 
    } 
} 

$jpath = adder ([ref]$json) $jsonList 
$jpath.value += $newItem 

같은 뭔가 다시, 이것은 $jpath 작동,하지만 아무것도 $json에 발생하지 않습니다. $jpath.value[70]을 시도하면 예상 답변을 얻을 수 있지만 $json[70]은 존재하지 않습니다. 실제로, 나는 기능없이 시도했다 :

$jpath = [ref]$json.commontokens.search.tokens.token 
$jpath.value += $newItem 

그러나 여전히 작동하지 않는다. 참조하는 일을 잘못하고 있습니까? 아니면 열쇠와 관련이 있습니까?

+0

귀하의 기능과 관련이있을 수 있습니다. 나는 당신이 함수 "가산기"를 만들고 그것의 내부에서 "가산기"를 참조하는 것을 본다. 그것은 당신이 무엇을 참조하고 있는지 알지 못하는 것에 대해 어떤 종류의 오류를 줄 것입니다. –

+0

개체 참조를 취하는 함수에 인수를 전달할 때 호출에 참조를 포함해야합니다 (예 :'adder -j ([ref] $ Json) -stringList $ List'). '$ j'를 반환 할 필요가 없습니다.'$ j.Value'를 조작해야합니다 (또한 유효한 객체를 전달하십시오) – TheIncorrigible1

+0

설명 :'return $ j.Value','$ j.Value + = 예제에서 $ first'와'$ jpath + = $ newItem'은 이것을 지워야합니다. – TheIncorrigible1

답변

0

그래서 나는 그것을 정말로 이해하지 못한다. 그러나 나는 그것을 작동시킬 수 있었다. 는 가산기에서, 나는 또한 내가 재귀를하고 있었다 더 분명하게하기 위해 return을 추가

([ref]$($jvalue.value.$first)) 

([ref]$j.value.$first) 

에서 재귀 라인을 변경했습니다.

웬일인지, 나는 아직도 할 수 없었다 $jpath.value += $newItem; 그러나 을 $jpath에서 제거하면 $jpath.value.token += $newItem이 작동합니다.

그래서 stringlist에서 모든 문자열을 추가하는 대신 마지막 하나를 건너 뛰었습니다. 가산기는 마지막 문자열을 건너 뛰도록 변경되었습니다 :

($stringList -ne $null) 

$stringlist 지금 실제로 단지 노드
($stringList-ne $stringList.list.last) 

로 변경되었습니다 (아마 이름을 변경해야합니다). 따라서 최종 코드는 $jpath.value.($stringList.Last.value) += $newItem입니다.

그냥 똑바로 수정할 수 없다고 생각합니다. $jpath.value? 또는 뭔가?