3

我正在尝试创建一个函数,该函数将根据需要从存储库 PSGallery 自动安装、更新和导入 PowerShell 模块,这将在构建服务器上运行,因此我必须避免任何类型的确认提示。如果模块已经加载到会话中(仅第一次),此函数将被经常调用,并且不会尝试安装或更新模块。

# Already imported? Let's not go further with updates and import again...
if (Get-Module -Name $moduleName)
{
    Write-Host "'$moduleName' is already imported to the current session!"

    return
}

如果该模块尚未安装,我将尝试安装它。问题是当我进入必须安装 NuGet PackageManagement 提供程序的步骤时(在导入从 PSGallery 安装模块所需的 PowerShellGet 模块之前)。我执行以下 cmdlet:

Install-PackageProvider -Name "NuGet" -Confirm:$false -Verbose

但我收到以下确认提示:

在此处输入图像描述

-Force我可以通过使用这样的参数来解决这个问题:

Install-PackageProvider -Name "NuGet" -Confirm:$false -Force -Verbose

但是我在该解决方案中看到的问题(可能不是什么大问题)是-Force即使安装的版本是最新的,每次使用都会再次下载并安装 NuGet。如果没有-Force参数,如果版本是最新的,它将跳过它,我更愿意这样做。

有没有办法将包源“ https://oneget.org/nuget-2.8.5.208.package.swidtag ”设置为受信任的,这样我就不会再次得到确认提示而无需使用-Force参数?

4

3 回答 3

1

实际上,如果你运行Get-PackageProvider -Name "NuGet" -Force它,它会自动下载并安装它,如果它没有安装。如果已安装,则将 NuGet 作为对象返回。我的 PowerShell 版本是 5.1.14393.1480。


原始回复

也许您可以检查它是否可用,然后运行您的命令?

$NuGetProvider = Get-PackageProvider -Name "NuGet" -ErrorAction SilentlyContinue
if ( -not $NugetProvider )
{
    Install-PackageProvider -Name "NuGet" -Confirm:$false -Force -Verbose
}
于 2017-08-15T14:55:46.953 回答
0

不知道这是否会有所帮助,但这里什么都没有:

你可以使用errorlevel的cmd版本的try-catch吗?

Install-PackageProvider -Name "NuGet" -Confirm:$false -Verbose
if errorlevel 1 GOTO Forced
exit /b
:Forced
Install-PackageProvider -Name "NuGet" -Confirm:$false -Force -Verbose
于 2017-08-15T15:01:00.980 回答
0

如何在 Get-PackageProvider 上使用 -ForceBoostrap 参数,例如

Get-PackageProvider -Name "nuget" -ForceBootstrap
于 2019-01-24T13:01:54.047 回答