programing

Powershell을 사용하여 상위 스코프 변수를 수정하는 방법

closeapi 2023. 8. 19. 10:20
반응형

Powershell을 사용하여 상위 스코프 변수를 수정하는 방법

powershell은 처음이라 상위 범위에서 변수를 수정하는 방법을 잘 모르겠습니다.

$val = 0
function foo()
{
    $val = 10
}
foo
write "The number is: $val"

실행 시 다음과 같은 이점이 있습니다.

The number is: 0

저는 그것을 10으로 하고 싶습니다.그러나 powershell은 상위 범위에 있는 변수를 숨기는 새 변수를 만들고 있습니다.

다음을 시도해 보았지만(문서에 따라) 성공하지 못했습니다.

$script:$val = 10
$global:$val = 10
$script:$val = 10

그러나 이것들은 말하자면 '컴파일'도 하지 않습니다.제가 무엇을 빠뜨리고 있나요?

글로벌 범위를 사용할 필요가 없습니다.동일한 이름을 가진 변수가 셸 콘솔에 이미 있을 수 있으며 대신 이 변수를 업데이트할 수 있습니다.스크립트 범위 한정자를 사용합니다.스코프 수정자를 사용할 때는 다음을 포함하지 않습니다.$변수 이름에 서명합니다.

$script:val=10 

상위 범위는 실제로 다음을 사용하여 직접 수정할 수 있습니다.Set-Variable -Scope 1의 필요 없이Script또는Global스코프 사용예:

$val = 0
function foo {
    Set-Variable -scope 1 -Name "Val" -Value "10"
}
foo
write "The number is: $val"

반환:

The number is: 10

자세한 내용은 Microsoft 문서 범위에 대한 문서에서 확인할 수 있습니다.그 문서에서 중요한 발췌문은 다음과 같습니다.

참고: Scope 파라미터를 사용하는 cmdlet의 경우 번호별로 스코프를 참조할 수도 있습니다.숫자는 한 스코프와 다른 스코프의 상대적 위치를 나타냅니다.범위 0은 현재 또는 로컬 범위를 나타냅니다.범위 1은 직접 상위 범위를 나타냅니다.범위 2는 상위 범위의 상위 범위 등을 나타냅니다.번호가 매겨진 범위는 재귀 범위를 많이 만든 경우에 유용합니다.


재귀 함수를 사용하려면 스코프를 적절히 조정해야 합니다.

$val = ,0
function foo {
    $b = $val.Count
    Set-Variable -Name 'val' -Value ($val + ,$b) -Scope $b
    if ($b -lt 10) {
        foo
    }
}

이미 답이 나왔음에도 세 번째 대안을 짚어보겠습니다.변수를 변경하려면 참조로 전달하는 것을 두려워하지 말고 그런 방식으로 작업하십시오.

$val=1
function bar ($lcl) 
{
    write "In bar(), `$lcl.Value starts as $($lcl.Value)"
    $lcl.Value += 9
    write "In bar(), `$lcl.Value ends as $($lcl.Value)"
}
$val
bar([REF]$val)
$val

이는 다음이 반환됩니다.

1
In bar(), $lcl.Value starts as 1
In bar(), $lcl.Value ends as 10
10

이 기능을 사용하려면 다음과 같은 작업을 수행할 수 있습니다.

$global:val=0 
function foo()
{
    $global:val=10 
}
foo
write "The number is: $val"

아마도 가장 쉬운 방법은 함수를 점 소스화하는 것입니다.

$val = 0
function foo()
{
    $val = 10
}
. foo
write "The number is: $val"

여기서 다른 점은 당신이 전화를 한다는 것입니다.foo경유로. foo.

도트 소싱 기능은 정상적으로 실행되지만 상위 범위 내에서 실행되므로 하위 범위가 없습니다.이렇게 하면 범위 지정이 기본적으로 제거됩니다.이 문제는 상위 범위에서 변수/정의를 의도치 않게 설정하거나 덮어쓰는 경우에만 발생합니다.작은 스크립트의 경우에는 일반적으로 그렇지 않으므로 닷 소싱 작업이 매우 쉽습니다.

단일 변수만 원하는 경우 반환 값을 사용할 수 있습니다. 예를 들어,

$val = 0
function foo()
{
    return 10
}
$val = foo
write "The number is: $val"

)return기능에 필요하지 않기 때문에)

를 들어 여러 값 을 반 있 수 설 습 니 다 도 할 정 를 변 수 여 러 환 여 하 니 다 ▁you 있 습 ▁in ▁variables ▁e ▁to 예를 들어 있습니다.$a, $b, $c = foo한다면foo된 환된반1,2,3.

위의 접근 방식은 교차 범위 변수를 처리하는 제가 선호하는 방법입니다.

▁the다▁place있을 배치할 수도 있습니다.write함수 자체에서 변수를 정의되는 것과 동일한 범위로 작성합니다.

솔루션인 물론, 스코페스솔루사수있다습도 할 수 .Set-Variable범위별로 또는 여기서 다른 사용자가 설명한 것처럼 [ref]를 통해 전달합니다.PowerShell에는 많은 솔루션이 있습니다.

언급URL : https://stackoverflow.com/questions/6766722/how-to-modify-parent-scope-variable-using-powershell

반응형