我发现在执行上下文很重要的某些情况下我会在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()
的上下文非常重要。
所以我的问题是:
答案 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)
查看cmdlet New-Alias - https://technet.microsoft.com/en-us/library/hh849959.aspx