如何编写中间带有参数的PowerShell别名?


76

我正在尝试设置Windows PowerShell别名以使用某些参数运行MinGW的g ++可执行文件。但是,这些参数必须位于文件名和其他参数之后。我不想麻烦地尝试设置一个函数以及所有这些。有没有一种方法可以简单地说:

alias mybuild="g++ {args} -lib1 -lib2 ..."

或类似的规定?我对PowerShell并不是很熟悉,而且我很难找到解决方案。任何人?

Answers:


119

您想使用一个函数,而不是别名,如Roman所提到的。像这样:

function mybuild { g++ $args -lib1 -lib2 ... }

要尝试一下,这是一个简单的示例:

PS> function docmd { cmd /c $args there }
PS> docmd echo hello
hello there
PS> 

您可能还希望将其放在配置文件中,以便在运行PowerShell时使其可用。您的配置文件的名称包含在中$profile


5
为使命令更易于访问而进行的一项改进是使用New-Alias将Alias映射到新功能。 Function SCP-Filetransfer { cmd /c pscp.exe -i ~\.ssh\id_rsa.ppk $args } New-Alias -Force pscp SCP-Filetransfer
TobiasHochgürtel16年

3
不利的
一面

5

没有内置的这种方法。恕我直言,包装器功能是迄今为止最好的方法。但是我知道发明了一些解决方法,例如:

https://web.archive.org/web/20120213013609/http://huddledmasses.org/powershell-power-user-tips-bash-style-alias-command


8
bash别名实际上与PowerShell函数或cmdlet更紧密地同义词。PowerShell中的别名实际上仅用于缩短现有功能/ cmdlet,例如rmRemove-Item的别名。
Goyuix

函数的问题是它们在Powershell中不受欢迎的开销。
bkr

4

要构建功能,请将其存储为别名,并将整个内容保留在配置文件中以备后用,请使用:

$g=[guid]::NewGuid();
echo "function G$g { COMMANDS }; New-Alias -Force ALIAS G$g">>$profile

您已ALIAS用所需的别名以及COMMANDS要执行的命令或命令字符串替换的位置。

当然,除了这样做,您可以(并且应该!)通过以下方式为上述内容创建别名:

echo 'function myAlias {
    $g=[guid]::NewGuid();
    $alias = $args[0]; $commands = $args[1]
    echo "function G$g { $commands }; New-Alias -Force $alias G$g">>$profile
}; New-Alias alias myAlias'>>$profile

为了防止您的大脑从所有递归(别名的别名等)中脱颖而出,在将第二个代码块粘贴到PowerShell(并重新启动PowerShell)之后,使用它的一个简单示例是:

alias myEcho 'echo $args[0]'

或没有参数:

alias myLs 'ls D:\MyFolder'

如果您还没有个人资料

如果您还没有个人资料,上述方法将失败!在这种情况下,请使用New-Item -type file -path $profile -force 此答案


1
当涉及到将管道输入别名命令中时,使用此命令(以及通过函数方法的所有其他别名)将失败。测试用例:ps | grep在哪里grep别名有效。grep函数在哪里,上面无限期地挂起。有没有解决方法?
ehiller

@ehiller,我无法复制您的问题,但是我的函数设计用于参数而不是管道。
NH。

>>创建一个按需文件,幸运的是,不需要额外的逻辑来处理$PROFILE尚不存在的文件。
mklement0

我喜欢您的方法的基本思想,但是实现的过程不必要地复杂:根本不需要通过aux创建PowerShell别名。函数-只需使用所需的“别名”名称直接定义一个函数
mklement0

@ mklement0并不是上面关于埃里尔的抱怨吗?
NH。

2

这是一个示例函数,将根据其调用方式执行不同的操作:

Function Do-Something {
[CmdletBinding()] 
[Alias('DOIT')]
Param(
    [string] $option1,
    [string] $option2,
    [int] $option3)
#$MyInvocation|select *|FL
If ($MyInvocation.InvocationName -eq 'DOIT'){write-host "You told me to do it...so i did!" -ForegroundColor Yellow}
Else {Write-Host "you were boring and said do something..." -ForegroundColor Green}
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.