2012-01-01 3 views
3

함수가 처리 된 후에 사용하려는 일부 변수를 만드는 함수를 사용하고 있습니다. 직접 액세스하려고 시도했지만 시도 할 수 없습니다. 이 일을 어떻게 하죠?함수가 실행 된 후에 함수 내에서 생성 된 변수에 액세스

+2

이 소스 코드를 공유 할 수 있도록 도와줍니다

$m =Get-Module myModule . $m { $myPrivateModuleVariable } 

희망? – rene

답변

8

함수가 실행 된 후에도 함수 내부의 변수가 유지되지 않습니다. 함수가 처리 된 후에 액세스하려면 범위 수정자를 접두어로 붙입니다. 자세한 내용은 콘솔에서

PS> function test-var{ $script:var='foo' } 
PS> test-var # excute the function 
PS> $var #print var 
foo 

유형이 : 셰이는 지적

PS> Get-Help about_Scopes 
+0

대단히 감사합니다! – Sune

5

당신은 높은 수준의 범위에서 사용할 수 있습니다 기능 범위 내 전역 변수이라는 것을 만들 수 있습니다. 그러나 전역 변수는 일반적으로 좋은 생각이 아니므로 몇 가지 대안을 제안하고 싶습니다. 그들은 일반적으로 그들의 이 아닌 지역의 정밀 나쁜 관행으로 간주됩니다

:

은 위키 피 디아 global variable 페이지입니다 그들이 보호 된 메모리에 상주하지 않는 전역 변수가 잠재적으로 어디서나 (에서 수정할 수 있습니다 그렇지 않으면 은 읽기 전용으로 렌더링 됨), 프로그램의 모든 부분은 그것에 의존 할 수 있습니다. [1] 따라서 전역 변수는 상호 종속성을 만들 수있는 무한한 가능성이 있으며 상호 종속성을 추가하면 복잡성이 증가합니다. 복잡성.

일부 대안 :

  • 함수 반환에게 호출자가 필요 데이터를 확인합니다. Powershell 함수는 일반적으로 Powershell 함수의 명사와 관련된 데이터를 반환해야합니다. naming convention 동사-Noun. 명사와 관련이없는 다른 데이터를 반환해야하는 경우 두 번째 기능을 고려하십시오.

    function Get-Directories { 
        param ([string] $Path) 
    
        # Code to get or create objects here. 
        $dirs = Get-ChildItem -Path $Path | where {$_.PsIsContainer} 
    
        # Explicitly return data to the caller. 
        return $dirs 
    } 
    
    $myDirs = Get-Directories -Path 'C:\' 
    
  • reference variable을 사용하십시오. 참조는 메모리에있는 변수의 주소를 함수로 전달합니다. 함수가 변수의 데이터를 변경하면 함수 외부에서 액세스 할 수 있지만 변수의 범위는 변경되지 않습니다. 이 도움이

    function Get-Directories { 
        param ([string] $Path, [ref] $Directories) 
        $Directories.Value = Get-ChildItem -Path $Path | where {$_.PsIsContainer} 
    } 
    
    $myDirs = $null 
    Get-Directories -Path 'C:\' -Directories ([ref] $myDirs) 
    

희망. 해피 코딩 :-)

+0

thourough 답변 주셔서 감사합니다! – Sune

3

함께 기능을 실행하면. 함수가 범위에서 실행되고 함수 내에 정의 된 모든 변수를 호출자가 사용할 수있게됩니다.

. $func 
$myPrivateVariable # Now Set in the parent scope. 

함수가 모듈에있는 경우, 당신은 또한 모듈의 범위에 액세스 할 트릭의이 종류를 사용할 수 있습니다 :이

+0

감사합니다! 그런데 왜 그 앞에 달러 기호를 사용하여 함수를 실행합니까? 변수처럼? – Sune

+0

샘플이기 때문에 :-)이 방법으로도 명령을 처리 할 수 ​​있습니다. 나는. $ a = Get-Command Get-Command; & $ a 또는 ScriptBlock : $ a = {$ b = 1}; . $ a; $ b –

관련 문제