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

时间:2015-02-19 20:30:09

标签: powershell alias

我发现在执行上下文很重要的某些情况下我会在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

任何这些都是可取的。我通常在命令行开关中封装的策略似乎不适用于这种情况,因为调用ExpandString()的上下文非常重要。

所以我的问题是:

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

3 个答案:

答案 0 :(得分:1)

似乎你需要一种方法来延迟评估$ 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。

答案 1 :(得分:0)

你可以为这个

制作自己的功能
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

答案 2 :(得分:-1)