如何让我自己的别名覆盖模块的别名?
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 可能 tf
或 tfile
。
在你的 $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
定义的别名(对于内置别名如 dir
和 select
),你面临两个次优选择:
或者:用-Option AllScope
重新定义它,然而,这意味着所有作用域将见新定义;例如,Set-Alias -Option AllScope touch touch.exe
.
或者:首先删除原始别名——例如,Remove-Item alias:touch
(PSv6+:Remove-Alias touch
)——然后是根据需要定义它,但是,这意味着其他范围将不再看到原始定义。
我在 $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 可能 tf
或 tfile
。
在你的 $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
定义的别名(对于内置别名如 dir
和 select
),你面临两个次优选择:
或者:用
-Option AllScope
重新定义它,然而,这意味着所有作用域将见新定义;例如,Set-Alias -Option AllScope touch touch.exe
.或者:首先删除原始别名——例如,
Remove-Item alias:touch
(PSv6+:Remove-Alias touch
)——然后是根据需要定义它,但是,这意味着其他范围将不再看到原始定义。