Как программно завершить функцию в PowerShell - PullRequest
0 голосов
/ 30 октября 2019

Я написал функцию, которая «оборачивается» вокруг 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 {} в качестве обходного пути для этой функции, однако мне все еще интересно, как «мягко завершить» функцию, если мне нужно.

1 Ответ

3 голосов
/ 30 октября 2019

Я бы просто сделал это следующим образом:

Function Install-ModuleWrapper {

    #Requires -RunAsAdministrator

    Param(
        [string]$ModuleName,
        [switch]$CheckIfInstalled
    )

    if ($CheckIfInstalled.IsPresent)
    {
        if (Get-Module -ListAvailable -Name $ModuleName) { Return "Module is installed" }
    }

    # Sicherstellen, dass NuGet Provider Installiert ist
    Write-Host "Installing stuff"

}

Для лучшего контроля, хотя, возможно, используйте Try ... Catch?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...