2017-08-15 179 views
2

我试图创建一个功能,将自动安装,更新和导入按需从存储库PSGallery PowerShell模块,这将在生成服务器上运行,所以我必须避免任何形式的确认提示。这个函数经常被调用,如果模块已经加载到会话中(仅在第一次),将不会尝试安装或更新模块。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 

但我得到以下确认提示:

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

enter image description here

我可以通过使用-Force参数一样,解决这个问题但是我用这个解决方案看到的问题(可能不是什么大问题)是使用-Force将下载并安装一个即使安装的版本是最新的,每次都获得NuGet。如果没有-Force参数,它只会跳过它,如果版本是最新的,我宁愿这样做。

有没有办法将软件包源'https://oneget.org/nuget-2.8.5.208.package.swidtag'设置为可信,所以我不再使用-Force参数来获得确认提示?

+0

Powershell 3以上有一个'Unblock-File' cmdlet。也许这可能有帮助? https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/unblock-file?view=powershell-6 –

回答

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 
} 
+0

谢谢。我真的很喜欢它,并且考虑过它,但是如何使用该解决方案管理更新?我将不得不找到一种方法来检查安装的软件包供应商NuGet版本是否是最新的(也许在Elseif声明中)。 – Vinhent

0

不知道这是否会帮助,但在这里不用什么:

您可以使用使用ERRORLEVEL的try-catch的CMD版本?

Install-PackageProvider -Name "NuGet" -Confirm:$false -Verbose 
if errorlevel 1 GOTO Forced 
exit /b 
:Forced 
Install-PackageProvider -Name "NuGet" -Confirm:$false -Force -Verbose