Я написал функцию, которая «оборачивается» вокруг Install-Module
, что означает, что он выполняет всю работу PackageProvider и PSRepository перед установкой модуля:
Function Install-ModuleWrapper {
#Requires -RunAsAdministrator
Param(
[string]$ModuleName,
[switch]$CheckIfInstalled
)
if ($CheckIfInstalled.IsPresent)
{
if (Get-Module -ListAvailable -Name $ModuleName) { Throw "Module is installed" }
}
# Sicherstellen, dass NuGet Provider Installiert ist
$NuGet = (Get-PackageProvider | Select-Object -ExpandProperty Name) -contains "NuGet"
if (!$NuGet) { Install-PackageProvider NuGet -Force > $null }
# Sicherstellen, dass PSGallery vertraut wird
Set-PSRepository PSGallery -InstallationPolicy Trusted
# Modul installieren
Install-Module $ModuleName
}
Я буду использовать эту функцию в сценарии, например, так:
Write-Host "Start"
. '\\server\share\Install-ModuleWrapper.ps1'
Install-ModuleWrapper PSWindowsUpdate -CheckIfInstalled
Write-Host "I print stuff to stdout"
Do-MoreStuff
Как вы можете видеть в функции, я хочу остановить функцию, если модуль уже установлен.
Однако, если я использую Throw
внутри Install-ModuleWrapper
,код после функции никогда не выполняется.
Могу ли я как-нибудь "мягко завершить" скрипт или функцию, чтобы другие вещи после функции все еще выполнялись?
Как я пишуя понимаю, что могу просто использовать if() {} else {}
в качестве обходного пути для этой функции, однако мне все еще интересно, как «мягко завершить» функцию, если мне нужно.