在保留设置位置开关的同时扩展cd功能

时间:2020-03-01 08:40:43

标签: powershell alias

我想扩展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功能,除非当我想要的新开关应用于现在被别名为它的辅助功能时?

2 个答案:

答案 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仅在单个范围内创建/修改别名-要么是当前范围,或通过可选的Set-Alias参数定位的范围-尽管该范围的所有后代范围也可以看到该定义。

这与给定别名的先前-Scope定义矛盾,因此PowerShell为您提供了两种解决矛盾的方法:

  • 修改现有的-Option AllScope定义,您必须通过指定来发出信号 AllScope 作为重新定义的一部分,这显然意味着您正在修改别名的整个会话范围定义。

  • 删除-Option AllScope删除预先存在的AllScope定义(不建议 使用,尤其是使用内置< / em>别名),然后允许您创建特定于示波器的别名(通过省略 Remove-Alias)。

请注意,如果您创建的别名不包含-Option AllScope,但在 global 范围内(例如,通过您的-Option AllScope文件或使用$PROFILE),则鉴于后代范围也能看到定义,并且 all 范围是全局范围的后代,因此效果与-Scope Global类似。 (包括模块) [1]

但是,任何后代作用域都可以覆盖全局定义。


[1]从技术上讲,可以创建不链接到全局范围的范围,但是该选项鲜为人知,在实践中很少使用。