Search code examples
powershellalias

Trying to create an alias to include options in powershell


My goal is to have an alias to run a command with -o at the end.

PS C:\Users\XXXX> vlab -o  <various different arguments>

I have tried to setup an alias, but Set-Alias recognizes -o as a parameter Option, and placing it in single or double quotes fails

> set-alias vlab 'vlab -o'
> vlab
vlab : The term 'vlab -o' is not recognized as the name of a cmdlet, function, script file, or operable program.

also setup a profile.ps1 with a function, but this just hangs when I run it.

Function VlabSpeed {
     vlab -o
}
Set-Alias vlab VlabSpeed

Is it possible to set an alias like this?


Solution

  • To recap:

    • PowerShell aliases can only map a name to another command name or executable file path - unlike in, say, Bash, defining arguments as part of the mapping is not supported.

    To incorporate arguments, you indeed need a function rather than an alias:

    • Inside that function, you can use @args to pass any arguments through to another command, as Santiago Squarzon points out.

    • There is no need for both an alias and a function - just name your function directly as the short name you desire.

    If your short (function) name is the same as the base file name of the external program that it wraps, you need to disambiguate the two to avoid infinite recursion:

    • On Windows:

      • Use the external program's filename extension, typically .exe:

        function vlab { vlab.exe -o @args }
        
    • On Unix-like platforms:

      • Given that executables there (typically) have no filename extension, use the full path to disambiguate:

        function vlab { /path/to/vlab -o @args }
        

    Note:

    • If your function also needs to support pipeline input, more work is needed: see this answer.