65

I have a PowerShell script that contains several functions. How do I invoke a specific function from the command line?

This doesn't work:

powershell -File script.ps1 -Command My-Func

5 Answers 5

130

You would typically "dot" the script into scope (global, another script, within a scriptblock). Dotting a script will both load and execute the script within that scope without creating a new, nested scope. With functions, this has the benefit that they stick around after the script has executed. You could do what Tomer suggests except that you would need to dot the script e.g.:

powershell -command "& { . <path>\script1.ps1; My-Func }"

If you just want to execute the function from your current PowerShell session then do this:

. .\script.ps1
My-Func

Just be aware that any script not in a function will be executed and any script variables will become global variables.

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

4 Comments

+1, the second code snippet was just what i needed, to do a simple debug of separate functions in a script file from ISE
In the second code snippet, you can surround the code with & { ... } as in & { . .\script1.ps1; My-Func } to avoid scope pollution.
If you have parameters on the function, put them after the function name e.g. powershell -command "& { . "C:\script.ps1"; MyMethod "arg1" "arg2" }"
Just wanted to mention that you actually don't need the -command option. One can just do powershell.exe "& { . <path>\script1.ps1; My-Func }"
6

The instruction throws the error message below. The dot is needed before the name of the file name to load it into memory, as Keith Hill suggested.

MyFunction: The term 'MyFunction' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

Comments

6

This solution works with powershell core:

powershell -command "& { . .\validate.ps1; Validate-Parameters }" 

Comments

4

Perhaps something like

powershell -command "& { script1.ps; My-Func }"

2 Comments

It failed, missing ". .\"
I'm pretty sure I tested it at the time (over a decade ago :-D) and the interpreter got stricter over the years. I hardly ever use Windows anymore, so I can't really test this though...
4

If it's a .psm1 file (as opposed to .ps1) then call this instead:

powershell -command "& { Import-Module <path>\script1.psm1; My-Func }"

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.