전역 변수 이름이 함수에 전달된 변수인 함수에서 전역 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
'programing' 카테고리의 다른 글
| 명령줄에서 사용자 로그아웃 (0) | 2023.08.28 |
|---|---|
| MySQL의 필드에서 가장 일반적인 값 선택 (0) | 2023.08.28 |
| Android 7.0(Nougat)부터는 기본 인터페이스 방법만 지원됩니다. (0) | 2023.08.28 |
| 선택 2 상자 높이를 변경하려면 어떻게 해야 합니까? (0) | 2023.08.28 |
| nodeJs 콜백 간단한 예 (0) | 2023.08.28 |