Search code examples
powershellglobal-variables

Global variable changed in function not effective


I just tried this code:

$number = 2

Function Convert-Foo {
    $number = 3
}
Convert-Foo
$number

I expected that function Convert-Foo would change $number to 3, but it is still 2.

Why isn't the global variable $number changed to 3 by the function?


Solution

  • No, I'm afraid PowerShell isn't designed that way. You have to think in scopes, for more information on this topic please read the PowerShell help about scopes or type Get-Help about_scopes in your PowerShell ISE/Console.

    The short answer is that if you want to change a variable that is in the global scope, you should address the global scope:

    $number = 2
    
    Function Convert-Foo {
        $global:number = 3
    }
    Convert-Foo
    $number
    

    All variables created inside a Function are not visible outside of the function, unless you explicitly defined them as Script or Global. It's best practice to save the result of a function in another variable, so you can use it in the script scope:

    $number = 5
        
    Function Convert-Foo {
       # do manipulations in the function
       # and return the new value
       $number * 10
    }
    
    $result = Convert-Foo
        
    # Now you can use the value outside the function:
    "The result of the function is '$result'"