在更新模块

时间:2018-11-18 07:22:17

标签: powershell

我正在使用Windows 10和Powershell 5.1

Get-PSRepository的结果为:

  

不受信任的PSGallery https://www.powershellgallery.com/api/v2

而更新模块返回错误

  

PackageManagement \ Install-Package:无法找到存储库'https://www.powershellgallery.com/api/v2/'。采用   Get-PSRepository查看所有可用的存储库。   在C:\ Program Files \ WindowsPowerShell \ Modules \ powershellget \ 2.0.1 \ PSModule.psm1:13000 char:20   + ... $ sid = PackageManagement \ Install-Package @PSBoundParameters   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~       + CategoryInfo:ObjectNotFound:(Microsoft.Power .... InstallPackage:InstallPackage)[安装包],例如      知觉       + FullyQualifiedErrorId:SourceNotFound,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

有什么解决办法的想法吗?

10 个答案:

答案 0 :(得分:13)

TL; DR

貌似在PowerShell中注册的PSGallery存储库的URL曾经指向https://www.powershellgallery.com/api/v2/,但在某些时候它已更改为https://www.powershellgallery.com/api/v2(注意末尾缺少正斜杠)。

λ  Get-PSRepository

Name                      InstallationPolicy   SourceLocation
----                      ------------------   --------------
PSGallery                 Untrusted            https://www.powershellgallery.com/api/v2

从旧URL安装的所有模块现在都无法更新。从PowerShell库中重新安装它们将更新存储库URL,从而允许正常情况下对模块进行更新。您可以使用以下命令来重新安装指向旧URL的所有模块:

Get-InstalledModule `
| ? { $_.Repository -eq 'https://www.powershellgallery.com/api/v2/' } `
| % { Install-Package -Name $_.Name -Source PSGallery -Force -AcceptLicense }

全部耗尽

我自己遇到了这个令人讨厌的问题。从错误消息中,我们可以看到以下几点:

  

PackageManagement \ Install-Package:无法找到存储库'https://www.powershellgallery.com/api/v2/'

  1. PowerShellGet\Update-Module最终将钱推给了 PackageManagement\Install-Package
  2. 正在寻找存储库 在“ https://www.powershellgallery.com/api/v2/

在我的计算机上运行Get-PSRepository会产生以下结果:

Name                      InstallationPolicy   SourceLocation
----                      ------------------   --------------
PSGallery                 Trusted              https://www.powershellgallery.com/api/v2

因此,看起来好像存储库在那里,除了,也许不是。注意尾随的前斜杠。难道Install-Package正在寻找一个与该字符串完全匹配的SourceLocation的存储库?让我们尝试为PSGallery更改SourceLocation

Set-PSRepository -Name PSGallery -SourceLocation https://www.powershellgallery.com/api/v2/ -InstallationPolicy Trusted
  

PackageManagement \ Set-PackageSource:PSGallery存储库具有   预定义的位置。 “位置,NewLocation或SourceLocation”   参数是不允许的,请在删除“位置”后重试,   NewLocation或SourceLocation”参数。在C:\ Program   文件\ WindowsPowerShell \ Modules \ PowerShellGet \ 2.0.4 \ PSModule.psm1:11768   字符:17   + ... $ null = PackageManagement \ Set-PackageSource @PSBoundParameters   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~       + CategoryInfo:InvalidArgument:(https://www.pow...ery.com/api/v2/:String)[Set-PackageSource],   例外       + FullyQualifiedErrorId:ParameterIsNotAllowedWithPSGallery,Add-PackageSource,Microsoft.PowerShell.PackageManagement.Cmdlets.SetPackageSource

嗯,那没用。看来PSGallery储存库出于您的安全受到保护

让我们尝试添加其他存储库并更新模块:

Register-PSRepository -Name PSGallery1 -SourceLocation https://www.powershellgallery.com/api/v2/ -InstallationPolicy Trusted
Update-Module -Name pester -Force

看,没有错误。可行!

这是有趣的事情,如果我拉出已安装模块的列表,则会发现混合存储库:

Get-InstalledModule | Select Name, Repository | FT -AutoSize

Name                         Repository
----                         ----------
7Zip4Powershell              PSGallery 
AWSPowerShell                PSGallery 
cChoco                       PSGallery1
dbatools                     PSGallery 
DLMAutomation                PSGallery1
InvokeBuild                  PSGallery1
Microsoft.PowerShell.Archive PSGallery1
PackageManagement            PSGallery 
Pester                       PSGallery1
posh-git                     PSGallery1
powershell-yaml              PSGallery1
PowerShellGet                PSGallery 
PowerUpSQL                   PSGallery1
psake                        PSGallery1
PsHosts                      PSGallery1
psTrustedHosts               PSGallery1
ReverseDSC                   PSGallery1
SeeShell                     PSGallery1
SqlServer                    PSGallery1
TunableSSLValidator          PSGallery1
xSmbShare                    PSGallery1
xWebAdministration           PSGallery1

查看从PSGallery1安装的所有与https://www.powershellgallery.com/api/v2/关联的模块!在此之前,我的计算机上从未存在过名为PSGallery1的存储库。我曾经安装的每个模块都来自PSGallery。我的猜测是,PSGallery存储库曾经指向https://www.powershellgallery.com/api/v2/,在某个时刻,无论是否有意将其更改为https://www.powershellgallery.com/avp/v2;对于从先前的URL安装的所有模块,请破坏Update-Module。我怀疑如果我使用Install-Package从更新的PSGallery存储库中重新安装模块,一切都会自行解决,并且可以删除PSGallery1存储库。

让我们更新从旧网址(PSGallery1)部署的所有模块:

Get-InstalledModule `
| ? { $_.Repository -eq 'PSGallery1' } `
| % { Install-Package -Name $_.Name -Source PSGallery -Force -AcceptLicense }

再次运行Get-InstalledModule会产生:

Name                         Repository
----                         ----------
7Zip4Powershell              PSGallery
AWSPowerShell                PSGallery
cChoco                       PSGallery
dbatools                     PSGallery
DLMAutomation                PSGallery
InvokeBuild                  PSGallery
Microsoft.PowerShell.Archive PSGallery
PackageManagement            PSGallery
Pester                       PSGallery
posh-git                     PSGallery
powershell-yaml              PSGallery
PowerShellGet                PSGallery
PowerUpSQL                   PSGallery
psake                        PSGallery
PsHosts                      PSGallery
psTrustedHosts               PSGallery
ReverseDSC                   PSGallery
SeeShell                     PSGallery
SqlServer                    PSGallery
TunableSSLValidator          PSGallery
xSmbShare                    PSGallery
xWebAdministration           PSGallery

太好了!现在,让我们尝试删除PSGallery1存储库并更新模块:

Unregister-PSRepository PSGallery1
Update-Module -Name pester -Force

成功!模块已更新,没有错误。

我不确定PSGallery存储库的URL或Install-Package在这里有什么问题,但是重新安装从旧URL安装的所有模块似乎可以解决所有问题。

答案 1 :(得分:7)

我遇到了同样的问题,并且发现了这个问题。我尝试了杰森·博伊德(Jason Boyd)(上面)写的所有内容,但是没有用。

搜索更多内容,找到此链接https://community.spiceworks.com/topic/2265662-powershell-get-download-problem

TLS 1.0 可能是罪魁祸首。建议跑步

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 

之后,我能够更新我的软件包。

答案 2 :(得分:1)

我在使用Windows Powershell 5.1.17134.407时遇到了相同的问题,并且还在PowerShell 6.1的同一台计算机上进行了测试。 Update-Module可以与PowerShell 6.1一起使用,并且在Windows PowerShell和PowerShell中具有相同版本的PowerShellGet模块。因此,问题似乎是Windows PowerShell所独有的,无需进一步测试就可以猜测,这是在Windows PowerShell上运行时PowerShellGet模块本身的Update-Module代码中的问题。

我没有使用Update-Module的解决方案,但可以使用-AllowClobber参数代替Install-Module。它不会像Update-Module一样因此错误而失败。而且,至少现在,最终结果将是相同的,因为Update-Module实际上只是与根据我的测试和https://github.com/PowerShell/PowerShellGet/issues/213安装的所有旧版本并排安装了新版本。

...

做完一些进一步的测试后,我碰巧重新启动了正在测试的系统。重新启动后,Windows PowerShell 5.1中的Update-Module问题已解决-Update-Module现在可以按预期工作。我不能肯定地说重启是解决它的原因,但是现在已经解决了。

答案 3 :(得分:1)

我知道自从该线程处于活动状态以来已经有一段时间了,但是我遇到了类似的问题。经过各种尝试后,强制重新安装Nuget软件包提供程序似乎已解决了Update-Module的问题。

在提升的PowerShell会话中执行此操作:

Install-PackageProvider Nuget –Force

作为参考,我取得最大成功的时候就在这里: https://docs.microsoft.com/en-us/powershell/gallery/installing-psget

欢呼

答案 4 :(得分:1)

我尝试了这个,但是我确实得到了PSGaller2的支持。 所以我进一步寻找了解决方案。由于我在VPN / Proxy envirenmont中,因此无法正常工作。当我用餐时,它对我有用。

$webclient=New-Object System.Net.WebClient
$webclient.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials

答案 5 :(得分:0)

对我来说,这些是有效的代码:

powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" 

$env:Path += ";C:\ProgramData\chocolatey\bin"

答案 6 :(得分:0)

我发现了类似的问题。就我而言,这是由于TLS而发生的。

我按照以下步骤解决了该问题,如下所示: 1.在64位.Net Framework(版本4及更高版本)上设置强密码学 Set-ItemProperty-路径'HKLM:\ SOFTWARE \ Wow6432Node \ Microsoft.NetFramework \ v4.0.30319'-名称'SchUseStrongCrypto'-值'1'-类型Dword

  1. 在32位.Net Framework(版本4及更高版本)上设置了强密码学 Set-ItemProperty-路径'HKLM:\ SOFTWARE \ Microsoft.NetFramework \ v4.0.30319'-名称'SchUseStrongCrypto'-值'1'-Type Dword

  2. 重新启动PS控制台

  3. 通过使用[Net.ServicePointManager] :: SecurityProtocol

  4. 检查受支持的协议
  5. 注册默认 Register-PSRepository-默认

答案 7 :(得分:0)

尝试一下:

[System.Net.WebRequest]::DefaultWebProxy.Credentials = System.Net.CredentialCache]::DefaultCredentials

get-psrepository

register-psrepository -default

答案 8 :(得分:0)

以上答案的结合为我解决了这个问题。

PS> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 
PS> Install-PackageProvider Nuget –Force
PS> Install-Module -Name PSWindowsUpdate

您可能需要先删除旧版本的PSWindowsUpdate才能安装新版本。

您可以执行-force,它将并排安装两个版本,但这可能不是最好的主意。

答案 9 :(得分:0)

修复:

  1. Install-Module -Name PowershellGet -Repository PSGallery -Force
  2. 关闭现有的 PowerShell 或 ISE 会话并开始新的会话
  3. 更新模块