有没有办法在 powershell 中为对象方法创建别名?

Is there a way to create aliases for object methods in powershell?

我发现在执行上下文很重要的某些情况下,我在 powershell 脚本中重复自己。延迟字符串扩展就是这样一种情况:

$MyString = 'The $animal says $sound.'

function MakeNoise{ 
   param($animal, $sound)
   $ExecutionContext.InvokeCommand.ExpandString($MyString)
}

PS> MakeNoise pig oink
The pig says oink.

那条很长的 ExpandString() 行经常重复。我希望该行像这样简洁:

xs($MyString)
xs $MyString
$MyString | xs

其中任何一个都是可取的。我通常在 commandlet 中封装的策略似乎不适用于这种情况,因为调用 ExpandString() 的上下文很关键。

所以我的问题是:

  1. 有没有办法为对象方法创建别名?
  2. 是否有其他方法可以在保留调用上下文的同时以简洁的方式调用对象的方法?

查看 cmdlet New-Alias - https://technet.microsoft.com/en-us/library/hh849959.aspx

您可以为此制作自己的函数

function xs{
    param(
    [Parameter(Mandatory=$True,ValueFromPipeline=$True)]
    [string]$expand)
    $ExecutionContext.InvokeCommand.ExpandString($expand)
}

function MakeNoise{ 
   param($animal, $sound)
   $MyString = 'The $animal says $sound.'
   xs $MyString
   # $MyString | xs     <--  would also work
}

MakeNoise pig oink

看来您需要一种方法来延迟对 $ExecutionContext 的评估,直到实际执行字符串扩展为止。这是一种实现方法,作为函数实现:

function xs
{
    [CmdletBinding()]
    param
    (
        [parameter(ValueFromPipeline=$true,
                   Position=0,
                   Mandatory=$true)]
        [string]
        $string
    )
    process
    {
        $code = "`$ExecutionContext.InvokeCommand.ExpandString(`"$string`")"
        [scriptblock]::create($code) 
    }
}

然后:

&($MyString | xs)
&(xs $MyString)

脚本块是在运行时创建的,因此每次调用都会评估 $ExecutionContext。