3

I am a beginner Powershell user. I am writing some script files (.ps1)

I would like to determine how my script was invoked:

Was is the "main" script or was it dot sourced from another file?

In python, I would use something like:

if __name__ == "__main__":

Is there something similar in PowerShell?

Update

After reading the answers, I am using the following at the end of my .ps1 file:

if ($MyInvocation.InvocationName -ne '.')
{
  # do "main" stuff here
}

Any answers that include how this could fail are welcome.

It appears this is a duplicate question, I just didn't use the right search terms: Determine if PowerShell script has been dot-sourced

2
  • 1
    about_Scopes Commented Mar 10, 2014 at 20:10
  • @HyperAnthony thanks for the link. Is there a equivalent one-liner for PowerShell to the python version? I understand that PowerShell scripts are ran from top to bottom. So I'd like to put a test condition near the bottom of my script that only if it passes, does the remainder of the script run. Commented Mar 10, 2014 at 20:19

1 Answer 1

5

If you're wanting to know how it was invoked, have a look at the $myinvocation automatic variable.

If you just want to test if you're in the global scope:

Try {if (get-variable args -scope 1){$true}}
Catch {$false}

should return $true if you're running in a child scope. If you're already in the global scope, there is no parent scope and it will throw an error and return $false.

Sign up to request clarification or add additional context in comments.

4 Comments

thank you, this seems to be good information. Do you know if the $myinvocation.CommandOrigin would give me what I want? My preliminary testing seems to show 'Runspace' if I started the script from powershell, and 'Internal' if another script is calling it? I have not found any detailed info on the CommandOrigin member.
I also see the InvocationName which seems to be either a '.' or the name of the script? Maybe this is a better way?
I don't know Python, so I'm not quite sure what to tell you to look for that would be the analog of that Python command.
Thanks! Every scope gets initialized with it's own $args, so it should always be there :).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.