我想扩展cd
的功能,但保留Set-Location
的所有现有参数。因此,我创建了一个函数go
,该函数可以执行很多其他工作,然后为其加上别名cd
(我必须使用-Option AllScope才能使其正常工作,有人知道为什么我不能只是重新别名CD,而不使用它?)
Set-Alias cd go -Option AllScope
问题是我希望go
做某些事情,但是每当调用标准Set-Location
开关时,我还要故障转移到Set-Location
功能:
Set-Location -LiteralPath <String> [-PassThru] [-UseTransaction] [<CommonParameters>]
Set-Location [[-Path] <String>] [-PassThru] [-UseTransaction] [<CommonParameters>]
Set-Location [-PassThru] [-StackName <String>] [-UseTransaction] [<CommonParameters>]
在通过创建辅助功能然后以这种方式重新使用内置别名的方式扩展内置Cmdlet的功能方面寻求建议吗?即我希望cd
继续执行所有的Set-Location
功能,除非当我想要的新开关应用于现在被别名为它的辅助功能时?
答案 0 :(得分:1)
其称为代理功能 参见blog post
答案 1 :(得分:1)
与MikeSh helpfully advises一样,代理功能(包装器功能)是解决之道:
创建您的go
函数作为Set-Location
cmdlet的代理(包装器)函数(或脚本),如this answer所示。
将自定义功能直接添加到该包装器功能。
go
是提供Set-Location
功能和所需的自定义功能的单一功能,因此Set-Alias cd go -Option AllScope
就足够了。
重要:由于您正在修改内置的会话范围别名,因此请确保您的go
函数是{的真超集 {1}}的功能;也就是说,请确保它既不修改也不限制原始行为-否则,第三方代码可能会发生故障。
我必须使用-Option AllScope才能使它正常工作,有人知道为什么不使用它就不能重新对CD进行别名吗?
内置{em> 别名Set-Location
是用cd
定义的;以这种方式定义的任何别名只能在以下情况下修改:
在重新定义上再次用-Option AllScope
指定-Option AllScope
。
原因是Set-Alias
表示别名自动出现在 any 范围内,这实际上意味着指定的定义适用于整个会话范围。 / p>
没有 -Option AllScope
,-Option AllScope
仅在单个范围内创建/修改别名-要么是当前默认情况下为em>范围,或通过可选的Set-Alias
参数定位的范围-尽管该范围的所有后代范围也可以看到该定义。
这与给定别名的先前-Scope
定义矛盾,因此PowerShell为您提供了两种解决矛盾的方法:
修改现有的-Option AllScope
定义,您必须通过指定来发出信号
AllScope
作为重新定义的一部分,这显然意味着您正在修改别名的整个会话范围定义。
删除用-Option AllScope
删除预先存在的AllScope
定义(不建议 使用,尤其是使用内置< / em>别名),然后允许您创建特定于示波器的别名(通过省略 Remove-Alias
)。
请注意,如果您创建的别名不包含-Option AllScope
,但在 global 范围内(例如,通过您的-Option AllScope
文件或使用$PROFILE
),则鉴于后代范围也能看到定义,并且 all 范围是全局范围的后代,因此效果与-Scope Global
类似。 (包括模块) [1] 。
但是,任何后代作用域都可以覆盖全局定义。
[1]从技术上讲,可以创建不链接到全局范围的范围,但是该选项鲜为人知,在实践中很少使用。