如何让我自己的别名覆盖模块的别名?

How do I make my own alias override a module's alias?

我在 $profile 中为 touch 创建了一个别名,但是我也使用 PSCX 似乎有它自己的 touch。当我 运行 touch PSCX 一个 运行s:

$ which touch
Pscx\Set-FileTime

如何让 PowerShell 更喜欢我的别名而不是模块别名?

将其作为答案而不是评论,这样我就可以输入更多文字。

https://serverfault.com/questions/452430/how-to-override-the-default-dir-alias-in-powershell

意见如下:

但是,根据您的使用情况,我强烈建议不要在任何脚本或模块中使用别名,因为它们可以更改并且可能无法执行您想要的操作。

如果您真的想使用别名,我可能会避免所有这些并创建一个仍然有意义的无冲突别名。 TouchFile 可能 tftfile

在你的 $PROFILE:

  • 首先,显式导入 PSCX 模块——此时,该模块的 touch 别名被导入并替换任何现有定义:Import-Module PSCX

    • 注意:添加 Import-Module PSCX,即使它目前 不是 在您的 $PROFILE 中;通常,模块是 auto-loaded, on demand,因为它位于 $env:PSModulePath 环境变量中列出的目录之一。
      正是按需导入——其时间是不可预测的(每当你第一次碰巧从模块调用命令时)——阻止了可靠的别名替换;在 $PROFILE 中强制导入模块之前 您定义别名的版本解决了这个问题。
  • 然后根据需要重新定义别名;例如:Set-Alias touch touch.exe

    • 警告:如果有人强行重新导入模块,稍后使用Import-Module -Force PSCX,您的别名将再次被替换。

注意:对于所讨论的特定别名没有必要,但为了替换用 -Option AllScope 定义的别名(对于内置别名如 dirselect),你面临两个次优选择:

  • 或者:-Option AllScope重新定义它,然而,这意味着所有作用域将见新定义;例如,Set-Alias -Option AllScope touch touch.exe.

  • 或者:首先删除原始别名——例如,Remove-Item alias:touch(PSv6+:Remove-Alias touch)——然后是根据需要定义它,但是,这意味着其他范围将不再看到原始定义。