破损的包管理器?无法找到模块提供者(PowerShellGet)

7

这是一个常见的错误,但我在互联网上找到的通用解决方案无法解决它。

运行Get-PsRepository、Install-Module和相关命令(OneGet?)时会抛出“无法找到模块提供程序(PowerShellGet)”错误。这似乎是NuGet包管理器模块的问题,但我不知道该如何恢复。安装的包提供程序似乎有效。

症状模式:
C:> [Net.ServicePointManager] :: SecurityProtocol

Tls12

获取-PSRepository

PackageManagement\Get-PackageSource : Unable to find module providers (PowerShellGet).
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:4496 char:31
+ ... ckageSources = PackageManagement\Get-PackageSource @PSBoundParameters
+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (Microsoft.Power...etPackageSource:GetPackageSource) [Get-PackageSource
   ], Exception
    + FullyQualifiedErrorId : UnknownProviders,Microsoft.PowerShell.PackageManagement.Cmdlets.GetPackageSource

使用-默认-详细注册-PSRepository

VERBOSE: PowerShell meta provider initialization failed.
VERBOSE: No match was found for the specified search criteria and provider name 'PowerShellGet'. Try
'Get-PackageProvider -ListAvailable' to see if the provider exists on the system.
PackageManagement\Register-PackageSource : Unable to find module providers (PowerShellGet).
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:4211 char:17
+ ...     $null = PackageManagement\Register-PackageSource @PSBoundParamete ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (Microsoft.Power...erPackageSource:RegisterPackageSource) [Register-Pac
   kageSource], Exception
    + FullyQualifiedErrorId : UnknownProviders,Microsoft.PowerShell.PackageManagement.Cmdlets.RegisterPackageSource  

安装模块PowerShellGet -Force

PackageManagement\Install-Package : Unable to find module providers (PowerShellGet).
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1809 char:21
+ ...          $null = PackageManagement\Install-Package @PSBoundParameters
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], Exception
    + FullyQualifiedErrorId : UnknownProviders,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

事实:
Windows 10 (1903)
Powershell版本为5.1.18362.1171
以管理员身份运行PowerShell
未在代理后面
可以访问https://www.powershellgallery.com/api/v2
可以访问nuget.org
`[Net.ServicePointManager]::SecurityProtocol = Tls12
FIPS已禁用(HKLM\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy\Enabled DWORD=0)
Get-PackageProvider只显示NuGet 2.8.5.208
PowerShellGet版本为1.0.0.1;尝试使用Install-Module PowerShellGet -Force进行SXS安装时,遇到相同的错误信息:PackageManagement\Install-Package : Unable to find module providers (PowerShellGet).


我似乎遇到了相同的错误,你能解决这个问题吗? - aolszowka
1
顺便说一句,我创建了一个全新的 Windows 1909 虚拟机,并尝试恢复软件包,在该环境中遇到了类似的故障。幸运的是,我能够利用未受影响的 PowerShell Core。如果您向 Microsoft 开放支持票据,请告诉我,这样我也可以跟进。 - aolszowka
3个回答

12

我们遇到了同样的问题。发现这个主题没有解决方案。但我深入挖掘,发现在出现问题的计算机上安装了1.4.7版本的PackageManagement。 删除此文件夹后,一切开始正常工作。我没有找到这个东西是如何安装的。看起来像微软的合法PowerShell模块,但它正在与“普通”的PowershellGet模块交互,并似乎破坏了它。 对于我们来说,它位于%USERPROFILE%/documents/WindowsPowershell/Modules。 另外值得注意的是,这个%USERPROFILE%是企业级OneDrive。

编辑:微软已经修复了这个问题:https://github.com/PowerShell/vscode-powershell/issues/3432


1
我最终也遇到了同样的情况。一个Windows 10 1909机器,其中%USERPROFILE%/document是企业OneDrive。将PackageManagement移出/WindowsPowerShell/后,Get-PSRepository的输出从无变为了PSGallery。谢谢! - tmcg
谢谢!一旦我启动了新的shell,立即从我的文档文件夹中删除1.4.7包管理文件夹就解决了这个问题!我的文档文件夹在企业onedrive上,但我认为真正的罪魁祸首可能是vscode,因为如果你让它保留旧的PM,它会要求升级 - 我完全忘记了这一点,我认为这才是最初引起问题的原因。 - GeneralZod
我也想真诚地感谢你。错误信息中没有指出冲突的个人模块。在删除有问题的模块后,一切都恢复正常了。再次感谢! - BHall
天啊,我刚刚花了5个小时来调试这个问题,你的答案救了我一命。真心感谢! - Bassinator
我刚刚浪费了整整一天的工作时间来寻找这个问题的答案,然后我偶然发现了这个解决方案... 不知道它是怎么出现的,但症状完全相同... 企业版 OneDrive... - NotoriousPyro
显示剩余3条评论

3

评论不足。

我遇到了同样的情况。一台Windows 10 1909机器,%USERPROFILE%/document是企业OneDrive。将PackageManagement移出/WindowsPowerShell/ 将Get-PSRepository的输出从无变为PSGallery。谢谢! - tmcg于3月1日21:35 这正是相同的问题。我怀疑这是因为PowerShell 7将其转储到此位置(可能是Visual Studio Code在提示更新时?) - aolszowka于3月1日22:09

我在个人资料中的%USERPROFILE%/documents中使用packagemanagement也遇到了同样的问题。当我在这台新机器上安装VScode和Powershell扩展时,文件日期匹配。

暂时从模块中删除该文件夹可以解决这个问题。


1
这也是我们所看到的,这与VS Code提供升级PackageManagement有关,我们认为这导致了这个问题。 - aolszowka
天啊,我刚刚花了5个小时来调试这个问题,你的答案救了我一命。真心感谢! - Bassinator

0

除了删除%USERPROFILE%/Documents/WindowsPowershell/Modules文件夹外,我还发现将软件包管理器放在本地有帮助:powershell.exe -NoLogo -NoProfile -Command 'Save-Module PackageManagement -MinimumVersion 1.4.7 -LiteralPath ""C:\Program Files\WindowsPowerShell\Modules\""' 感谢itsho在这里 https://github.com/PowerShell/vscode-powershell/issues/2824#issuecomment-750902181

原因是由于%USERPROFILE%/Documents文件夹位于OneDrive上,并且模块安装默认情况下会将PackageManagement模块安装到用户文档中,而忽略PSModulePath,即使已经删除/更改了OneDrive位置。

这是我在vscode内运行PS时的模块路径,识别信息已被删除:

$env:PSModulePath -split ';'
C:\Users\{myUsername}\OneDrive - {myCompanyName}\{company}\Documents\WindowsPowerShell\Modules
C:\Program Files\WindowsPowerShell\Modules
C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

有更多的事情可以做来避免这种情况再次发生,这里讨论了https://github.com/PowerShell/PowerShell/issues/15552#issuecomment-1002708799。比如像这里所示将文档文件夹设置为本地和关闭OneDrive https://support.microsoft.com/en-us/topic/configuration-of-the-my-documents-folder-dfd9a90d-8f80-18d6-e7cc-f1566fc3b10b

我现在按照这些步骤进行了操作。

  1. 在资源管理器中,在快速访问下方右键单击“文档”,然后单击“属性”。
  2. 切换到配置框中的位置选项卡,输入文档文件夹的新路径,我使用了本地路径。
  3. 单击“否”,这样现有文件就不会移动,仍然可以通过进入OneDrive来访问。我还为我的OneDrive位置添加了另一个快速访问文件夹,但这取决于您自己的需求。 注意:这也会影响其他程序,例如PowerPoint的默认保存位置。您需要注意不要将某些东西保存在本地,以为它会备份到OneDrive。

更改后我的模块路径:

$env:PSModulePath -split ';'
C:\Users\{myUsername}\Documents\WindowsPowerShell\Modules
C:\Program Files\WindowsPowerShell\Modules
C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

另一个解决方法可能是让OneDrive保留本地文件。

  1. 导航到%USERPROFILE%/Documents
  2. 右键单击WindowsPowershell并选择“始终保留在此设备上”。 我还没有能够测试这个,但它可能是最不影响的解决方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接