internal/functions/Set-ServiceStartMode.ps1

function Set-ServiceStartMode {
    <#
        .SYNOPSIS
        Internal function. Implements the method that changes startup mode of the SQL Server service.
 
        .DESCRIPTION
        Accepts objects from Get-DbaService and performs a corresponding action.
 
        .PARAMETER InputObject
        A collection of services from Get-DbaService.
 
        .PARAMETER Mode
        Startup mode of the service: Automatic, Manual or Disabled.
 
        .PARAMETER WhatIf
        Shows what would happen if the cmdlet runs. The cmdlet is not run.
 
        .PARAMETER Confirm
        Prompts you for confirmation before running the cmdlet.
 
        .NOTES
        Author: Kirill Kravtsov ( @nvarscar )
 
        dbatools PowerShell module (https://dbatools.io)
        Copyright: (c) 2018 by dbatools, licensed under MIT
        License: MIT https://opensource.org/licenses/MIT
 
        .EXAMPLE
        Get-DbaService -ComputerName sql1 | Set-ServiceStartMode -Mode 'Manual'
 
        Sets all SQL services on sql1 to Manual startup.
 
        .EXAMPLE
        $services = Get-DbaService -ComputerName sql1
        Set-ServiceStartMode -InputObject $services -Mode 'Automatic'
 
        Sets all SQL services on sql1 to Automatic startup.
 
#>

    [CmdletBinding(SupportsShouldProcess = $true)]
    param (
        [string]$Mode,
        [parameter(ValueFromPipeline, Mandatory)]
        [object[]]$InputObject
    )
    begin {
        $callStack = Get-PSCallStack
        if ($callStack.Length -gt 1) {
            $callerName = $callStack[1].Command
        } else {
            $callerName = $callStack[0].Command
        }
        $ProcessArray = @()
    }
    process {
        #Get all the objects from the pipeline before proceeding
        $ProcessArray += $InputObject
    }
    end {
        foreach ($service in $ProcessArray) {
            #Get WMI object
            $Wmi = Get-DbaCmObject -ComputerName $service.ComputerName -Namespace "root\cimv2" -Query "SELECT * FROM Win32_Service WHERE Name = '$($service.ServiceName)'" -EnableException
            if ($Pscmdlet.ShouldProcess($Wmi, "Changing the Start Mode to $Mode")) {
                $x = $Wmi | Invoke-CimMethod -MethodName ChangeStartMode -Arguments @{ StartMode = $Mode }
                if ($x.ReturnValue -ne 0) {
                    Stop-Function -EnableException $EnableException -Message ("The attempt to change the start mode of $($service.ServiceName) on $($service.ComputerName) returned the following message: " + (Get-DbaServiceErrorMessage $x.ReturnValue))
                    return
                }
            }
        }
    }
}