Yes, in PowerShell lingo /D
is called a parameter (other shells may call it an option or a flag, as Abraham Zinala notes), but note that PowerShell only accepts -
as the parameter-name sigil, so it would have to be -D
(on invocation you're free to use -d
or -D
, because parameter names aren't case-sensitive in PowerShell).
A parameter that acts as an on/off switch (called a flag in other shells, i.e. one that doesn't take an argument), is called a switch [parameter] in PowerShell.
Note that while you can define single-letter parameter names in PowerShell, it is customary to use longer, descriptive names, e.g. -Desktop
:
Thanks to what PowerShell calls elastic syntax, you can still use just -d
on invocation, as long as the d
unambiguously implies the full target parameter name (e.g., -Desktop
).
Alternatively, you may explicitly declare -d
to be an alias for -Desktop
, by decorating the parameter declaration with an [Alias()]
attribute.
Here's a sample function that works slightly differently from what you specified, but operates in a more PowerShell-idiomatic way:
Parameter-less invocation changes to the current user's home folder.
- To target a different user's home folder, pass the username to the
-u
/ -UserName
parameter.
Whatever user's home folder is chosen in a given invocation can optionally be combined with either -Desktop
/ -d
or -Scripts
/ -s
, in order to change to the desktop / scripts folder for the targeted user.
To show help, use -?
(or Get-Help folder
), which PowerShell supports by default, showing the command's syntax.
- To add a verbal description to the help, you can use comment-based help to your function - see the conceptual about_Comment_Based_Help help topic.
Push-Location
rather than Set-Location
(whose built-in alias is cd
) is used to change location, to enable returning to the previous folder with Pop-Location
(whose built-in aliases are popd
and popl
)
The function below is a so-called advanced function, which means that it acts like a (binary) cmdlet; for more information, see the conceptual about_Functions_Advanced and about_Functions_Advanced_parameters help topics.
function folder {
[CmdletBinding(DefaultParameterSetName='Default')]
param(
[Alias('u')]
[string] $Username
,
[Alias('s')]
[Parameter(ParameterSetName='Scripts')]
[switch] $Scripts
,
[Parameter(ParameterSetName='Desktop')]
[Alias('d')]
[switch] $Desktop
)
$targetFolder =
if ($Username) {
Join-Path (Split-Path -LiteralPath $HOME) $Username
} else {
$HOME
}
if ($Scripts) {
$targetFolder += '\Desktop\Scripts'
} elseif ($Desktop) {
$targetFolder += '\Desktop'
}
Push-Location -LiteralPath $targetFolder
}
Sample calls:
folder # change to current user's home folder
folder -d # change to current user's desktop folder
folder -u jdoe -s # change to jdoe's scripts folder
folder -? # show help