我正在尝试从未连接到 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 与我的问题没有任何关系
尽管我已经尝试了所有以前的答案,但只有以下一个解决了:
1 - 打开 Powershell(以管理员身份)
2 - 运行:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
3 - 运行:
Install-PackageProvider -Name NuGet
作者是 Niels Weistra:Microsoft Forum
我接受了 trebleCode's answer,但我想通过遵循 trebleCode 的回答,提供更多关于我在未连接的 Win 7 机器上安装感兴趣的 nupkg pswindowsupdate.2.0.0.4.nupkg
的步骤的详细信息。
首先:经过一番挖掘,我想我找到了 trebleCode 所指的 MS 文档:
Bootstrap the NuGet provider and NuGet.exe
为了继续,正如 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.nupkg
到 c:\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
我想我可以走了
MSDocs 为您的方案说明了这一点:
为了第一次执行,PackageManagement 需要 Internet 连接来下载 Nuget 包提供程序。但是,如果您的计算机没有 Internet 连接并且您需要使用 Nuget 或 PowerShellGet 提供程序,您可以在另一台计算机上下载它们并将它们复制到您的目标计算机。使用以下步骤执行此操作:运行 Install-PackageProvider -Name NuGet -RequiredVersion 2.8.5.201 -Force 从具有 Internet 连接的计算机安装提供程序。安装后,您可以在 $env:ProgramFiles\PackageManagement\ReferenceAssemblies\\
-RequiredVersion
或 -Force
不是必需的。在此评论中,有一个更新版本的 2.8.5.208 可用。
尝试这个:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Install-PackageProvider NuGet -Force
Set-PSRepository PSGallery -InstallationPolicy Trusted
该提供程序与 PowerShell>=6.0 捆绑在一起。
如果您只需要一种从文件安装软件包的方法,只需从 github 发布页面获取最新版本的 .msi 安装程序,将其复制到机器上,安装并使用它。
这是我在基于 windows/servercore
的 Dockerfile
中使用的脚本,用于通过 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 处可见
该线程中的所有选项都不适合我。我正在使用 PowerShell Core 7.1.5。对我有用的是从 $env:PSModulePath 中删除 Windows Powershell 模块。本质上,检查您的环境变量并查找任何包含“WindowsPowerShell”的路径并将其删除。
为了以非交互方式安装 Nuget 包管理器,只需使用绕过提示的 -Force
标志:
Install-PackageProvider NuGet -Force
您不必使用有关安全协议的技巧,至少对于 Windows Powershell (5.1)。