-
An alias in PowerShell allows you to define an alternative name for another command.
-
Unlike in POSIX-compatible shells such as
bash
, you cannot include pass-through arguments in its definition – you need a function for that. -
The typical use case is to define a short alternative name for convenience of interactive invocation; for instance, PowerShell has a built in
gc
alias for itsGet-Content
cmdlet. PowerShell even recommends a naming convention for aliases, based on official short alias prefixes for its approved verbs, such as theg
for theGet
verb in the given example. -
Another, problematic use is to define aliases named for a different shell’s commands; for instance, PowerShell has a built in
dir
alias for itsGet-ChildItem
, named forcmd.exe
‘s (Command Prompt’s) internaldir
command. While that may be somewhat helpful while transitioning fromcmd.exe
, it only works in very simple invocations, and quickly becomes problematic due to PowerShell’s fundamentally different command-line syntax and differing parameter names. -
Another, unproblematic use is to define an alias for an external executable whose directory isn’t listed in the path (
$env:PATH
); e.g., if you want to executec:\path\to\foo.exe
as justfoo
without having to addc:\path\to
to$env:PATH
, you can useSet-Alias foo c:\path\to\foo.exe
. -
Unlike in POSIX-compatible shells such as
bash
, aliases are (invariably) usable in scripts (*.ps1
files), but their use in scripts is discouraged in the interest of robustness and long-term stability.
-
-
A function, as is to be expected, is a named unit of code that can accept arguments and can perform arbitrary operations.
- A function is what you need to use if you want to wrap existing commands, by hard-coding pass-through arguments and / or providing custom logic around the invocation of the wrapped command – see this answer.
As for whether it makes sense to define an alias for a function, if implementation of your command requires a function (due to requiring more than just a simple name mapping):
-
If all you need is one (short) name for your command, you can define your function directly with that name – no alias needed.
-
By contrast, if your function needs a long name, especially an advanced (cmdlet-like) function that adheres to PowerShell’s verb-noun naming convention (e.g.,
Invoke-Foo
), and you also want a short name for interactive convenience (e.g.,foo
), you’ll have to also define an alias for that function with that short name (e.g.,Set-Alias foo Invoke-Foo
).