Putting functions in separate script and dot-sourcing them - what will the scope be

17,758

Solution 1

When you dot source code it will behave as if that code was still in the original script. The scopes will be the same as if it was all in one file.

C:\functions.ps1 code:

$myVariable = "Test"

function Test-DotSource {
    $script:thisIsAvailableInFunctions = "foo"
    $thisIsAvailableOnlyInThisFunction = "bar"
}

main.ps1 code

$script:thisIsAvailableInFunctions = ""

. C:\functions.ps1

# Call the function to set values.
Test-DotSource

$script:thisIsAvailableInFunctions -eq "foo" 
# Outputs True because of the script: scope modifier

$thisIsAvailableOnlyInThisFunction -eq "bar" 
# Outputs False because it's undefined in this scope.

$myVariable -eq "Test"                       
# Outputs true because it's in the same scope due to dot sourcing.

Solution 2

My 2cents:

Usually (after a past Andy Arismendi answer! God bless you man!) I save all my scripts in $pwd folder (added in system path environment). The I can call them from the console wihtout dot sourcing and no script variable poisoning the console after a script ends his job.

If you cannot modify yours functions in simple scripts (sometimes it happens) I'm agree with Trevor answer to create a module and import it in $profile

Share:
17,758
Sune
Author by

Sune

If isn't broke, break it and then fix it.

Updated on June 05, 2022

Comments

  • Sune
    Sune almost 2 years

    I've put my functions in a separate file and I call the file with:

    $workingdir = Split-Path $MyInvocation.MyCommand.Path -Parent
    . "$workingdir\serverscan-functions.ps1"                        
    

    But, if I call the scripts like

    my-function
    

    how will the variable scope (from within "my-function") be? Should I still $script:variable to make the variable exist outside the function or have I dot-sourced the function as well?

    Hope I don't confuse anyone with my question... I've tried to make it as understandable as possible, but still learning all the basic concept so I find it hard to explain..

  • Sune
    Sune about 12 years
    So this means that all variables created in a function in the external file (serverscan-functions.ps1) will be accessible outside of the function? Is there a way I can prevent this and still have my functions in a separate file?
  • Andy Arismendi
    Andy Arismendi about 12 years
    @Sune I updated my answer with some examples. Hopefully it helps.
  • Sune
    Sune about 12 years
    Just what I was looking for!!