【问题标题】:Extend cd functionality while retaining Set-Location switches在保留 Set-Location 开关的同时扩展 cd 功能
【发布时间】:2020-03-01 08:40:43
【问题描述】:

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

【问题讨论】:

    标签: powershell alias


    【解决方案1】:

    作为MikeSh helpfully advises,代理函数(包装函数)是要走的路:

    • 创建go 函数作为Set-Location cmdlet 的代理(包装)函数(或脚本),如this answer 中所示。

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

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

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


    我必须使用 -Option AllScope 才能让它工作,有谁知道为什么我不能不使用它就重新命名 cd 吗?

    内置别名cd是用-Option AllScope定义的;只有当
    -Option AllScope 再次在重定义 上用Set-Alias 指定时,才能修改以这种方式定义的任何别名。

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

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

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

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

    • 删除带有Remove-Alias的预先存在的AllScope定义(这是可取的,尤其是使用内置别名),然后允许您创建 范围特定 别名(通过省略 -Option AllScope)。

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

    但是,任何后代范围都可以覆盖全局定义。


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

    【讨论】:

      【解决方案2】:

      它被称为代理函数 见blog post

      【讨论】:

      • 谢谢迈克,我已经读过了,真的很有用。将其他 Mike 标记为答案,因为他链接到一个非常有用的示例和 -Scope 点。干杯。
      猜你喜欢
      • 1970-01-01
      • 2017-08-06
      • 2022-01-10
      • 1970-01-01
      • 2012-07-25
      • 2011-06-04
      • 1970-01-01
      • 2017-03-22
      • 2021-04-11
      相关资源
      最近更新 更多