programing

전역 변수 이름이 함수에 전달된 변수인 함수에서 전역 PowerShell 변수 설정

jooyons 2023. 8. 28. 21:00
반응형

전역 변수 이름이 함수에 전달된 변수인 함수에서 전역 PowerShell 변수 설정

함수에서 전역 변수를 설정해야 하는데 어떻게 해야 할지 잘 모르겠습니다.

# Set variables
$global:var1
$global:var2
$global:var3

function foo ($a, $b, $c)
{
    # Add $a and $b and set the requested global variable to equal to it
    $c = $a + $b
}

함수 호출:

foo 1 2 $global:var3

최종 결과:

$global:var3은 3으로 설정됩니다.

아니면 제가 이렇게 기능을 불렀다면,

foo 1 2 $global:var2

최종 결과:

$global:var2는 3으로 설정됩니다.

저는 이 예가 말이 되기를 바랍니다.함수에 전달되는 세 번째 변수는 설정할 변수의 이름입니다.

사용할 수 있습니다.Set-Variablecmdlet.패싱$global:var3의 값을 보냅니다.$var3당신이 원하는 것이 아닙니다.이름을 보내려고 합니다.

$global:var1 = $null

function foo ($a, $b, $varName)
{
   Set-Variable -Name $varName -Value ($a + $b) -Scope Global
}

foo 1 2 var1

하지만 이것은 그다지 좋은 프로그래밍 연습은 아닙니다.다음은 훨씬 간단하고 나중에 버그가 발생할 가능성이 적습니다.

$global:var1 = $null

function ComputeNewValue ($a, $b)
{
   $a + $b
}

$global:var1 = ComputeNewValue 1 2

다음과 같이 간단합니다.

$A="1"
function changeA2 () { $global:A="0"}
changeA2
$A

자체 코드 문제를 해결하는 동안 이 문제를 발견했습니다.

그래서 이것은 작동하지 않습니다...

$myLogText = ""
function AddLog ($Message)
{
    $myLogText += ($Message)
}
AddLog ("Hello")
Write-Host $myLogText

기능은 PowerShell ISE에서만 작동하는 것으로 보입니다.

$myLogText = ""
function AddLog ($Message)
{
    $global:myLogText += ($Message)
}
AddLog ("Hello")
Write-Host $myLogText

ISE와 명령줄 모두에서 실제로 작동하는 것은 다음과 같습니다.

$global:myLogText = ""
function AddLog ($Message)
{
    $global:myLogText += ($Message)
}
AddLog ("Hello")
Write-Host $global:myLogText

인수를 참조 유형으로 전달해야 합니다.

#First create the variables (note you have to set them to something)
$global:var1 = $null
$global:var2 = $null
$global:var3 = $null

#The type of the reference argument should be of type [REF]
function foo ($a, $b, [REF]$c)
{
    # add $a and $b and set the requested global variable to equal to it
    # Note how you modify the value.
    $c.Value = $a + $b
}

#You can then call it like this:
foo 1 2 [REF]$global:var3

래킨의 답변에서 첫 번째 제안은 좋아 보이지만, 아래의 장황한 방법을 제안합니다.

PS c:\temp> $global:test="one"

PS c:\temp> $test
one

PS c:\temp> function changet() {$global:test="two"}

PS c:\temp> changet

PS c:\temp> $test
two

하지만 그의 두 번째 제안은 잘못된 프로그래밍 연습에 대한 것입니다. 이와 같은 간단한 계산에서는 충분히 공평하지만 변수에서 더 복잡한 출력을 반환하려면 어떻게 해야 할까요?예를 들어 함수가 배열이나 개체를 반환하도록 하려면 어떻게 해야 합니까?바로 여기서 PowerShell 기능이 크게 실패하는 것 같습니다.즉, 전역 변수를 사용하여 함수에서 다시 전달하는 것 외에는 선택의 여지가 없습니다.예:

PS c:\temp> function changet([byte]$a,[byte]$b,[byte]$c) {$global:test=@(($a+$b),$c,($a+$c))}

PS c:\temp> changet 1 2 3

PS c:\temp> $test
3
3
4

PS C:\nb> $test[2]
4

이것이 약간 탈선처럼 느껴질 수도 있다는 것을 알지만, 원래 질문에 답하기 위해서는 글로벌 변수가 나쁜 프로그래밍 관행인지, 그리고 더 복잡한 기능에서 더 나은 방법이 있는지 확인해야 한다고 생각합니다. (만약 여기에 관심이 있는 것이 있다면)

@zdan. 좋은 대답입니다.이런 식으로 개선할 겁니다

PowerShell에서 실제 반환 값에 가장 근접할 수 있는 것은 로컬 변수를 사용하여 값을 전달하고 사용하지 않는 것입니다.return어떤 형태로든 출력 상황에 의해 '유효'될 수 있기 때문에.

function CheckRestart([REF]$retval)
{
    # Some logic
    $retval.Value = $true
}
[bool]$restart = $false
CheckRestart( [REF]$restart)
if ( $restart )
{
    Restart-Computer -Force
}

$restart변수는 함수에 대한 호출의 양쪽에서 사용됩니다.CheckRestart변수의 범위를 명확히 합니다.반환 값은 선언된 첫 번째 또는 마지막 매개 변수일 수 있습니다.저는 꼴찌가 좋습니다.

변수를 함수 외부의 전역 변수로 설정한 다음 함수 내부의 값을 설정합니다.

언급URL : https://stackoverflow.com/questions/12535419/setting-a-global-powershell-variable-from-a-function-where-the-global-variable-n

반응형