如何使用包含破折号的模块名称来限定命令?

How to qualify a command with a module name containing a dash?

在 PowerShell 中,如何使用包含破折号的模块名称限定命令名称(在调用中)?

具体来说,我正在尝试调用 posh-git\Write-VcsStatus,但解释器无法将此识别为模块限定命令。我已经导入了 posh-git 模块;我的 $PSModuleAutoLoadingPreference 无论如何都默认为 All;并且我已验证我安装的 posh-git 版本包含命令 Write-VcsStatus。这个问题与在我的相同环境中工作的其他示例形成对比,例如PowerLine\New-PromptText.


供参考,我的$PSVersionTable如下:

Name                           Value
----                           -----
PSVersion                      6.2.0
PSEdition                      Core
GitCommitId                    6.2.0
OS                             Microsoft Windows 10.0.17763 
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

问题与模块名称中 - (HYPHEN-MINUS, U+002D) 的存在无关,调用 posh-git\Write-GitStatus 有效这一事实证明了这一点。

相反,问题是 posh-git module 是以非标准方式定义的:

自模块版本 0.7.3 起,导出函数 Write-VcsStatus 定义如下:

function Global:Write-VcsStatus { # ...

也就是说,该函数位于全局范围,这意味着它在技术上在运行时不是模块的一部分](尽管被列为导出函数,甚至 tab-completion 认为它是模块的常规部分)。

因此,您只能在 不使用 模块限定符 posh-git\ 的情况下调用它,作为 Write-VcsStatus 或明确地作为 global:Write-VcsStatus

我无法解释 为什么 函数以这种方式声明 - 底层 GitHub repo 乍一看没有提供任何线索,但您可以考虑创建一个问题那里。