首页 > 解决方案 > Windows $PATH 中的 rm 二进制文件,但 Powershell 仍然更喜欢 Remove-Item

问题描述

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

我发现 Powershell 更喜欢 Windows 本机命令而不是PATH.

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

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

与任何有 Windows 版本的命令相同 - find,mkdir等。

检查我知道 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 命令(无需手动别名)?

标签: windowspowershell

解决方案


基于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,特别是)。


推荐阅读