ChatGPT解决这个技术问题 Extra ChatGPT

Powershell:如何在未连接的计算机上安装适用于 PowerShell 的 Nuget 提供程序,以便可以从 PS 命令行安装 nuget 包?

我正在尝试从未连接到 Internet 的 Win 7 计算机上的 Powershell 命令行安装 pswindowsupdate.2.0.0.4.nupkg。我正在运行 PS 5.1.14409.1005。我从 https://www.preview.powershellgallery.com/packages/PSWindowsUpdate/2.0.0.4 获得了 nupkg

PS 命令 Install-Module -Name pswindowsupdate.2.0.0.4.nupkg -Repository {path to pswindowsupdate.2.0.0.4.nupkg} 引发错误消息:

PowerShellGet 需要 NuGet 提供程序版本“2.8.5.201”或更高版本才能与基于 NuGet 的存储库进行交互。 NuGet 提供程序必须在“C:\Program Files\PackageManagement\ProviderAssemblies”或“C:\Users{my login}\AppData\Local\PackageManagement\ProviderAssemblies”中可用。您还可以通过运行“Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force”来安装 NuGet 提供程序。是否希望 PowerShell 现在安装和导入 NuGet 提供程序?

当然,说“是”无法安装 NuGet 提供程序,因为我没有连接到 Internet。

我获得了 nuget.exe (v4.7.0),将其存储在“C:\Program Files\PackageManagement\ProviderAssemblies”中,并将“C:\Program Files\PackageManagement\ProviderAssemblies”添加到我的 path 语句中。但是,执行 Install-Module -Name pswindowsupdate.2.0.0.4.nupkg -Repository {path to pswindowsupdate.2.0.0.4.nupkg} 仍然失败。

NuGet provider 到底是什么?它只是nuget.exe吗?如何获取并安装适用于 PowerShell 的 Nuget 提供程序(v2.8.5.201 或更高版本),以便我可以从 PowerShell 命令行安装此 nuget 包?

注意:Visual Studio 与我的问题没有任何关系


L
Luis Gouveia

尽管我已经尝试了所有以前的答案,但只有以下一个解决了:

1 - 打开 Powershell(以管理员身份)

2 - 运行:

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

3 - 运行:

Install-PackageProvider -Name NuGet

作者是 Niels Weistra:Microsoft Forum


出于某种原因,Microsoft 尚未将该存储库更新为更好的 SSL 版本,因此在使用命令 2 允许降级 TLS 版本之前我遇到了错误。谢谢你的提示!
解决了我有互联网连接但安装包仍然抱怨连接问题的问题
我认为这应该是解决方案。
如果在系统上启用了 FIPS,那么也会引发错误
这仍然需要互联网连接,不知道为什么它被接受为答案
v
vineel

我接受了 trebleCode's answer,但我想通过遵循 trebleCode 的回答,提供更多关于我在未连接的 Win 7 机器上安装感兴趣的 nupkg pswindowsupdate.2.0.0.4.nupkg 的步骤的详细信息。

首先:经过一番挖掘,我想我找到了 trebleCode 所指的 MS 文档:

Bootstrap the NuGet provider and NuGet.exe

Install-PackageProvider

为了继续,正如 trebleCode 所说,我做了以下

在我连接的机器上安装 NuGet 提供程序

在连接的机器(Win 10 机器)上,我从 PS 命令行运行 Install-PackageProvider -Name NuGet -RequiredVersion 2.8.5.208 -Force。 Nuget 软件是从 'Net 获得的,并安装在我的本地连接机器上。

安装后,我在 C:\Program Files\PackageManagement\ProviderAssemblies 找到了 NuGet 提供程序软件(注意:文件夹名称 \ProviderAssemblies 而不是 \ReferenceAssemblies 是相对于 trebleCode 答案的一个细微差别。

提供程序软件的文件夹结构如下:

C:\Program Files\PackageManagement\ProviderAssemblies
   \NuGet
      \2.8.5.208
         \Microsoft.PackageManagement.NuGetProvider.dll
     

在我未连接的机器上安装 NuGet 提供程序

我将 \NuGet 文件夹(及其所有子文件夹)从连接的机器复制到拇指驱动器上,并将其复制到未连接(Win 7)机器上的 C:\Program Files\PackageManagement\ProviderAssemblies

我在未连接的 (Win 7) 机器上启动 PS (v5) 并运行 Import-PackageProvider -Name NuGet -RequiredVersion 2.8.5.208 以将提供程序导入当前的 PowerShell 会话。

我运行 Get-PackageProvider -ListAvailable 并看到了这个(NuGet 出现在以前不存在的地方):

Name                     Version          DynamicOptions                                                                                                                                                                      
----                     -------          --------------                                                                                                                                                                      
msi                      3.0.0.0          AdditionalArguments                                                                                                                                                                 
msu                      3.0.0.0                                                                                                                                                                                              
NuGet                    2.8.5.208        Destination, ExcludeVersion, Scope, SkipDependencies, Headers, FilterOnTag, Contains, AllowPrereleaseVersions, ConfigFile, SkipValidate                                             
PowerShellGet            1.0.0.1          PackageManagementProvider, Type, Scope, AllowClobber, SkipPublisherCheck, InstallUpdate, NoPathUpdate, Filter, Tag, Includes, DscResource, RoleCapability, Command, PublishLocati...
Programs                 3.0.0.0          IncludeWindowsInstaller, IncludeSystemComponent

在我未连接的机器上创建本地存储库

在未连接的(Win 7)机器上,我创建了一个文件夹作为我的 PS 存储库(例如,c:\users\foo\Documents\PSRepository

我注册了回购:Register-PSRepository -Name fooPsRepository -SourceLocation c:\users\foo\Documents\PSRepository -InstallationPolicy Trusted

安装 NuGet 包

我在未连接的 Win7 机器上获取并复制了 nupkg pswindowsupdate.2.0.0.4.nupkgc:\users\foo\Documents\PSRepository

我通过执行 Find-Module -Repository fooPsRepository 了解了模块的名称

Version    Name                                Repository           Description                                                                                                                      
-------    ----                                ----------           -----------                                                                                                                      
2.0.0.4    PSWindowsUpdate                     fooPsRepository      This module contain functions to manage Windows Update Client.

我通过执行 Install-Module -Name pswindowsupdate 安装了模块

我通过执行 Get-Command –module PSWindowsUpdate 验证了安装的模块

CommandType     Name                                               Version    Source                                                                                                                 
-----------     ----                                               -------    ------                                                                                                                 
Alias           Download-WindowsUpdate                             2.0.0.4    PSWindowsUpdate                                                                                                        
Alias           Get-WUInstall                                      2.0.0.4    PSWindowsUpdate                                                                                                        
Alias           Get-WUList                                         2.0.0.4    PSWindowsUpdate                                                                                                        
Alias           Hide-WindowsUpdate                                 2.0.0.4    PSWindowsUpdate                                                                                                        
Alias           Install-WindowsUpdate                              2.0.0.4    PSWindowsUpdate                                                                                                        
Alias           Show-WindowsUpdate                                 2.0.0.4    PSWindowsUpdate                                                                                                        
Alias           UnHide-WindowsUpdate                               2.0.0.4    PSWindowsUpdate                                                                                                        
Alias           Uninstall-WindowsUpdate                            2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Add-WUServiceManager                               2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Enable-WURemoting                                  2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Get-WindowsUpdate                                  2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Get-WUApiVersion                                   2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Get-WUHistory                                      2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Get-WUInstallerStatus                              2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Get-WUJob                                          2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Get-WULastResults                                  2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Get-WURebootStatus                                 2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Get-WUServiceManager                               2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Get-WUSettings                                     2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Get-WUTest                                         2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Invoke-WUJob                                       2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Remove-WindowsUpdate                               2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Remove-WUServiceManager                            2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Set-WUSettings                                     2.0.0.4    PSWindowsUpdate                                                                                                        
Cmdlet          Update-WUModule                                    2.0.0.4    PSWindowsUpdate 

我想我可以走了


@OP,很好的细节,这肯定会让你在这里获得一些声誉。我相信我也有一天会回来看它的!哈哈。这似乎是创建几个脚本来自动化这个繁琐过程的好机会。我将不得不在一些虚拟机上玩这个
Install-PackageProvider 正在下载 onegetcdn.azureedge.net/providers/…(通过 go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409)并最终到达 onegetcdn.azureedge.net/providers/… - 如果您需要另一种方法来执行此操作。
你好,我也遇到同样的问题。但是我的问题略有不同,我没有看到动态选项,但在我执行 listavailable 脚本时仍然看到 nuget 2.8.5.208 之前有人遇到过这个问题吗?
他们说安装 Linux 软件很复杂……哈哈。
这是一个很棒的解释@william-charlton。这很好地完成了接受的答案。我成功完成了离线包安装。谢谢!
t
trebleCode

MSDocs 为您的方案说明了这一点:

为了第一次执行,PackageManagement 需要 Internet 连接来下载 Nuget 包提供程序。但是,如果您的计算机没有 Internet 连接并且您需要使用 Nuget 或 PowerShellGet 提供程序,您可以在另一台计算机上下载它们并将它们复制到您的目标计算机。使用以下步骤执行此操作:运行 Install-PackageProvider -Name NuGet -RequiredVersion 2.8.5.201 -Force 从具有 Internet 连接的计算机安装提供程序。安装后,您可以在 $env:ProgramFiles\PackageManagement\ReferenceAssemblies\\\\\ 或 $env:LOCALAPPDATA\PackageManagement\ProviderAssemblies\\\ 中找到安装的提供程序\\<提供者版本\>。将文件夹(在本例中为 Nuget 文件夹)放在目标计算机上的相应位置。如果您的目标计算机是 Nano 服务器,则需要从 Nano Server 运行 Install-PackageProvider 以下载正确的 Nuget 二进制文件。重新启动 PowerShell 以自动加载包提供程序。或者,运行 Get-PackageProvider -ListAvailable 以列出计算机上所有可用的包提供程序。然后使用 Import-PackageProvider -Name NuGet -RequiredVersion 2.8.5.201 将提供程序导入到当前的 Windows PowerShell 会话。


我面临同样的问题并按照您的步骤操作,但是对于第 4 步,当我执行 Get-PackageProvider -ListAvailable 时,nuget 仍然没有出现。 C:\Program Files\PackageManagement\ProviderAssemblies\nuget\2.8.5.201 存在,但似乎根本无法使用 Nuget..
当 Install-PackageProvider 没有源位置输入时,这怎么可能是解决方案?
抱歉,我不知道,我现在没有在我的角色中使用 NuGet 和 PowerShell,并且已经有几年没有接触过 NuGet。 @WilliamCharlton 在下面发布了一个很好的答案,其中包含更多技术细节。滚动并祝你好运!
-RequiredVersion-Force 不是必需的。在此评论中,有一个更新版本的 2.8.5.208 可用。
如果安装 NuGet 时出错,可能需要运行如下所述的 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 行。
m
mellifluous

尝试这个:

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

Install-PackageProvider NuGet -Force

Set-PSRepository PSGallery -InstallationPolicy Trusted

P
Parker Lindey

该提供程序与 PowerShell>=6.0 捆绑在一起。

如果您只需要一种从文件安装软件包的方法,只需从 github 发布页面获取最新版本的 .msi 安装程序,将其复制到机器上,安装并使用它。


也许修改您的答案以提供示例?
Y
Yves Martin

这是我在基于 windows/servercoreDockerfile 中使用的脚本,用于通过 Artifactory 镜像实现完整的 PowerShellGallery 设置(也适用于 onegetcdn.azureedge.net)

ARG ONEGET_NUGET_PROVIDER="Microsoft.PackageManagement.NuGetProvider-2.8.5.208.dll"
ARG ONEGET_PROVIDERS="https://artifactory/artifactory/generic-azureedge-onegetcdn/providers/"
 
RUN $ProviderPath = 'C:/Program Files/PackageManagement/ProviderAssemblies/'; `
    New-Item -ItemType "directory" -Path $ProviderPath -Force; `
    Invoke-WebRequest -Uri "${Env:ONEGET_PROVIDERS}${Env:ONEGET_NUGET_PROVIDER}" -OutFile "${ProviderPath}${Env:ONEGET_NUGET_PROVIDER}"; `
    Register-PSRepository -Name "artifactory-powershellgallery-remote" -SourceLocation "https://artifactory/artifactory/api/nuget/powershellgallery-remote"; `
    Unregister-PSRepository -Name PSGallery;

位置和 dll 版本在 https://onegetcdn.azureedge.net/providers/providers.masterList.feed.swidtag 处可见


这是一个潜在的解决方案。我意识到我的服务器无法连接到 onegetcdn.azureedge.net。
E
Everton Barciela

该线程中的所有选项都不适合我。我正在使用 PowerShell Core 7.1.5。对我有用的是从 $env:PSModulePath 中删除 Windows Powershell 模块。本质上,检查您的环境变量并查找任何包含“WindowsPowerShell”的路径并将其删除。


a
adamency

为了以非交互方式安装 Nuget 包管理器,只需使用绕过提示的 -Force 标志:

Install-PackageProvider NuGet -Force

您不必使用有关安全协议的技巧,至少对于 Windows Powershell (5.1)。