public/Stop-UnraidVm.ps1

function Stop-UnraidVm {
    <#
    .SYNOPSIS
        Stops a VM.

    .PARAMETER InputObject
        VM to stop (accepts pipeline).

    .PARAMETER Name
        VM name.

    .PARAMETER Force
        Immediate power-off instead of graceful shutdown.

    .PARAMETER Session
        Unraid session (defaults to current session).

    .EXAMPLE
        Stop-UnraidVm -Name "Windows10"

    .EXAMPLE
        Stop-UnraidVm -Name "Ubuntu" -Force
    #>

    [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = "ByName")]
    [OutputType('void')]
    param(
        [Parameter(Mandatory, ParameterSetName = "ByObject", ValueFromPipeline)]
        [UnraidVm[]]$InputObject,

        [Parameter(Mandatory, ParameterSetName = "ByName", Position = 0)]
        [string]$Name,

        [Parameter()]
        [switch]$Force,

        [Parameter()]
        [UnraidSession]$Session = $script:DefaultUnraidSession
    )

    process {
        $vms = Resolve-UnraidVm -InputObject $InputObject -Name $Name -ParameterSetName $PSCmdlet.ParameterSetName -Session $Session
        if (!$vms) { return }

        foreach ($vm in $vms) {
            $action = if ($Force) { 'forceStop' } else { 'stop' }
            $actionDesc = if ($Force) { "Force Stop Virtual Machine" } else { "Stop Virtual Machine" }
            
            Invoke-UnraidStateChange -Id $vm.Id -Name $vm.Name -Action $action -Type 'vm' -ShouldProcessAction $actionDesc -Session $Session -Cmdlet $PSCmdlet
        }
    }
}