I have a script that I am utilizing functions to wrap parts of the code that allow me to move through the sections at a specified point. What I have found is that I have to have the functions listed first in the script for it to run correctly.
$stepChoice = read-host 'Where would you like to start.' switch($stepChoice) { 1{Step1} 2{Step2} 3{Step3} } # Steps.ps1 function Step1 { 'Step 1' Step2 } function Step2 { 'Step 2' Step3 } function Step3 { 'Step 3' 'Done!' }
This give me the following error:
The term 'Step1' 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.
At C:\Tools\Scripts\functiontest.ps1:7 char:12 + 1{Step1 <<<< } + CategoryInfo : ObjectNotFound: (Step1:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException*
If I change the order around it works fine:
# Steps.ps1 function Step1 { 'Step 1' Step2 } function Step2 { 'Step 2' Step3 } function Step3 { 'Step 3' 'Done!' } #steps $stepChoice = read-host 'Where would you like to start.' switch($stepChoice) { 1{Step1} 2{Step2} 3{Step3} }
I am guessing that it is because PS is not loading the functions.
Why is this and is there a better way to lay out this code structure?
PowerShell is a script, not a compiled language. Therefore, it goes through the script line-by-line, top to bottom, (after tokenizing the script) and evaluates each command along the way.
Before you can run a script on Windows, you need to change the default PowerShell execution policy. Execution policy does not apply to PowerShell running on non-Windows platforms. The default execution policy, Restricted , prevents all scripts from running, including scripts that you write on the local computer.
A simple functionA function in PowerShell is declared with the function keyword followed by the function name and then an open and closing curly brace. The code that the function will execute is contained within those curly braces. The function shown is a simple example that returns the version of PowerShell.
A function in PowerShell is a grouping of code that has an optional input and output. It's a way of collecting up a bunch of code to perform one or many different times by just pointing to it instead of duplicating that code repeatedly.
Remember that in general, what works in a script should work at the command line.
This was not true in CMD. GOTO
and FOR %I IN (...) DO %%I
are two examples.
In PowerShell, I can run commands at the command line until I get the result I want, then paste the history in to a script, then edit out the extraneous bits.
Also, I can take a script that isn't working correctly, paste it in to an interactive shell, and study the resulting state.
At the interactive command line, there's no way you could write this:
F function F { "Hello, World!" }
However, when reading a script, I want to read the top-level code first, and then see more detail as I scroll down. One approach is:
function Main { F } function F { "Hello, World!" } Main
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With