Powershell equivalent of python's if __name__ == '__main__': Powershell equivalent of python's if __name__ == '__main__': python python

Powershell equivalent of python's if __name__ == '__main__':


$MyInvocation.Invocation has information about how the script was started.

If ($MyInvocation.InvocationName -eq '&') {    "Called using operator: '$($MyInvocation.InvocationName)'"} ElseIf ($MyInvocation.InvocationName -eq '.') {    "Dot sourced: '$($MyInvocation.InvocationName)'"} ElseIf ((Resolve-Path -Path $MyInvocation.InvocationName).ProviderPath -eq $MyInvocation.MyCommand.Path) {    "Called using path: '$($MyInvocation.InvocationName)'"}


$MyInvocation has lots of information about the current context, and those of callers. Maybe this could be used to detect if a script is being dot-sourced (i.e. imported) or executed as a script.

A script can act like a function: use param as first non-common/whitespace in the file to defined parameters. It is not clear (one would need to try different combinations) what happens if you dot-source a script that starts param...

Modules can directly execute code as well as export functions, variables, ... and can take parameters. Maybe $MyInvocation in a module would allow the two cases to be detected.

EDIT: Additional:

$MyInvocation.Line contains the command line used to execute the current script or function. Its Line property has the scrip text used for the execution, when dot-sourcing this will start with "." but not if run as a script (obviously a case to use a regex match to allow for variable whitespace around the period).

In a script run as a function


As of now I see 2 options that work

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

and

if ($MyInvocation.CommandOrigin -eq 'Runspace') {#do main stuff}