You could also declare named parameters explicitly. For example:
param([switch]$someBoolSwitch=$false, [String]$nameOfSomething="some default string")
This allows you to pass in named arguments to your script, like the following example:
.\<nameOfScript.ps1> -someBoolSwitch -nameOfSomething "Slayer Roolz!"
and if you omitted -nameOfSomething "Slayer Roolz!", then $nameOfSomething would simply default to "some default sting". Similarly, $someBoolSwitch defaults to $false unless otherwise defined.
This method has the benefit of allowing you as the developer to decide which parameters are necessary and which ones can be omitted or defaulted. Furthermore, it allows the user to enter arguments in any order they like, since they're named and not positional.
One drawback to having named parameters as opposed to positional parameters is that the command-line invocation can become quite large since the user has to type in each parameter name.