扩展 cd 功能,同时保留 Set-Location 开关

Extend cd functionality while retaining Set-Location switches

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

它调用了代理函数 见 blog post

一样,代理函数(包装函数)是可行的方法:

  • 创建 go 函数作为 Set-Location cmdlet 的代理(包装)函数(或脚本),如 .[=38 中所示=]

  • 将您的自定义功能直接添加到此包装函数。

go 是同时提供 Set-Location 功能和所需自定义功能的单个函数,因此 Set-Alias cd go -Option AllScope 就足够了。

重要提示:由于您正在修改内置的会话范围别名,请确保您的 go 函数是 true Set-Location 功能的超集;也就是说,确保它既不修改也不限制原始行为 - 否则,第三方代码可能会出现故障。


I had to use -Option AllScope to get this to work, does anyone know why I can't just re-alias cd without using that?

内置别名cd定义为-Option AllScope;以这种方式定义的任何别名只能在
时修改 -Option AllScope 重新定义 上再次指定为 Set-Alias

原因是 -Option AllScope 意味着别名自动出现在 any 范围内,这实际上意味着指定的定义适用于 session-宽.

Without -Option AllScope, Set-Alias 仅在 单一 范围内创建/修改别名 - 这是默认情况下的 current 范围,或者通过可选的 -Scope 参数定位的范围 - 尽管该范围的所有 descendant 范围都可以看到定义也是。

这与给定别名的预先存在的 -Option AllScope 定义相矛盾,因此 PowerShell 为您提供了两个解决矛盾的选项:

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

  • 删除带有Remove-Alias的先前存在的AllScope定义(建议 , 尤其是 built-in 别名), 然后允许你创建一个 scope-specific 别名 (通过 omitting-Option AllScope).

请注意,如果您创建的别名没有 -Option AllScope,但在 全局 范围内(例如,通过您的 $PROFILE 文件或使用 -Scope Global),效果 -Option AllScope 相似,假设 descendant 作用域也参见定义并且假设 所有范围都是全局范围的后代(包括模块)[1].

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


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