简体   繁体   中英

Equivalent to Bash alias in PowerShell

A newbie PowerShell question:

I'd like to make an alias in PowerShell exactly equivalent to this Bash alias:

alias django-admin-jy="jython /path/to/jython-dev/dist/bin/django-admin.py"

In tinkering with it so far, I've found this to be very difficult.

-PowerShell aliases only work with PowerShell commands + function calls

-No clear way to allow for an unlimited number of arguments on a PowerShell function call

-PowerShell seems to block stdout


It's worth noting that I've tried the solution put forth here: http://huddledmasses.org/powershell-power-user-tips-bash-style-alias-command/

And have gotten the following syntax-related error on loading up PowerShell:


The term 'which' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spell
ing of the name, or if a path was included, verify that the path is correct and try again.
At C:\Users\Dan\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1:9 char:27

+             $cmd = @(which <<<<  $_.Content)[0]
    + CategoryInfo          : ObjectNotFound: (which:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PowerShell aliases do not allow for arguments .
They can only refer to a command name , which can be the name of a cmdlet or a function, or the name / path of a script or executable.

To get what you are after, you need to define a function :

function django-admin-jy {
    jython.exe /path/to/jython-dev/dist/bin/django-admin.py @args
}

This uses a feature available since PowerShell 2.0 called argument splatting : you can apply @ to a variable name that references either an array or a hashtable.
In this case, we apply it to the automatic variable named args , which contains all arguments (that weren't bound to explicitly declared parameters - see about_Functions ).

If you want a truly generic way to create aliases functions that take parameters, try this:

function New-BashStyleAlias([string]$name, [string]$command)
{
    $sb = [scriptblock]::Create($command)
    New-Item "Function:\global:$name" -Value $sb | Out-Null
}

New-BashStyleAlias django-admin-jy 'jython.exe /path/to/jython-dev/dist/bin/django-admin.py @args'

Functions can have arbitrarily many arguments. You just need to use $args to access them.

As for the stdout issue: What exactly are you experiencing?

I was struggling with this for a while and I've written this PowerShell module:

https://www.powershellgallery.com/packages/HackF5.ProfileAlias

https://github.com/hackf5/powershell-profile-alias

To get started you install it by:

Install-Module HackF5.ProfileAlias
Register-ProfileAliasInProfile

Then use it like:

Set-ProfileAlias dkfeed 'Enter-Docker feed_app_container' -Bash

I've been using it for a while myself and I've found it fairly useful.

(It only runs on PS 7.0 as I wrote it for myself).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM