繁体   English   中英

Windows $PATH 中的 rm 二进制文件,但 Powershell 仍然更喜欢 Remove-Item

[英]rm binary in Windows $PATH but Powershell still prefers Remove-Item

我在 Windows 上安装了 GNU 核心实用程序,并将bin文件夹添加到我在 Windows 中的用户PATH变量中。

我发现 Powershell 更喜欢 Windows 本机命令而不是PATH具有相同名称的命令。

例如,在运行get-command rm ,powershell 会通知我它已映射到内部

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           rm -> Remove-Item

与任何有 Windows 版本的命令相同 - findmkdir等。

检查我知道 Windows 没有替代方法的命令给了我正确的二进制位置

get-command md5sum

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     md5sum.exe                                         5.3.0.1936 C:\Users\alshd\bin\coreutils\bin\md5sum.exe

有没有办法告诉 PowerShell 更喜欢我在 PATH 中指定的版本而不是本机 Windows 命令(无需手动为它们设置别名)?

基于Lee Dailey的有益评论:

  • PowerShell 别名比具有相同(基本)名称的外部程序具有更高的优先级

    • 请注意,优先规则意味着在没有rm别名的情况下,(假设的) rm函数也将优先(甚至是cmdlet ,尽管cmdlet的动词-名词命名约定使这极不可能)。

    • 要看到存在指定名称的所有命令的形式,使用Get-Command-All开关: Get-Command rm -All

    • 绕过命名冲突,请使用其文件扩展名调用外部程序在本例中为rm.exe 使用程序的(完整)路径也可以。

  • 虽然建议脚本和模块不要使用别名 - 换句话说:建议仅将别名用作交互便利 - 实际上它们确实如此,因此如果您删除内置别名,则存在破坏代码的风险,例如作为rm

  • 如果您愿意承担此风险,请参阅下文了解如何删除rm别名; 如果您希望删除也适用于所有未来的 PowerShell 会话,请将调用添加到您的$PROFILE文件中。


要删除rm别名,请使用Remove-Item别名提供程序提供的标准Alias:驱动器:

Remove-Item Alias:rm -Force

笔记:

  • PowerShell (Core) 6+ 中,您可以更简单地使用Remove-Alias rm -Force

  • 并非所有别名都需要-Force才能删除,但许多内置别名都需要(尽管不是rm ,特别是)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM