Skip to content

Set-VirtualMachineStartPolicy

VMware: Modifies the virtual machine start policy

#Requires -Version 5.1
#Requires -Modules VMware.VimAutomation.Core
[CmdletBinding(DefaultParameterSetName = "byName")]
Param(
    [Parameter(Mandatory = $true, ParameterSetName = "byID")]
    [Parameter(Mandatory = $true, ParameterSetName = "byName")]
    [string]$VIServer,
    [Parameter(Mandatory = $true, ParameterSetName = "byID")]
    [Parameter(Mandatory = $true, ParameterSetName = "byName")]
    [pscredential]$VICredential,
    [Parameter(Mandatory = $true, ParameterSetName = "byID")]
    [string]$VMId,
    [Parameter(Mandatory = $true, ParameterSetName = "byName")]
    [string]$VMName,
    [Parameter(ParameterSetName = "byID")]
    [Parameter(ParameterSetName = "byName")]
    [ValidateSet("None", "PowerOn")]
    [string]$StartAction = "None",
    [Parameter(ParameterSetName = "byID")]
    [Parameter(ParameterSetName = "byName")]
    [int32]$StartDelay,
    [Parameter(ParameterSetName = "byID")]
    [Parameter(ParameterSetName = "byName")]
    [int32]$StartOrder,
    [Parameter(ParameterSetName = "byID")]
    [Parameter(ParameterSetName = "byName")]
    [ValidateSet("None", "Suspend", "PowerOff", "GuestShutdown")]
    [string]$StopAction = "None",
    [Parameter(ParameterSetName = "byID")]
    [Parameter(ParameterSetName = "byName")]
    [int32]$StopDelay,
    [Parameter(ParameterSetName = "byID")]
    [Parameter(ParameterSetName = "byName")]
    [switch]$InheritStartDelayFromHost,
    [Parameter(ParameterSetName = "byID")]
    [Parameter(ParameterSetName = "byName")]
    [switch]$InheritStopActionFromHost,
    [Parameter(ParameterSetName = "byID")]
    [Parameter(ParameterSetName = "byName")]
    [switch]$InheritStopDelayFromHost,
    [Parameter(ParameterSetName = "byID")]
    [Parameter(ParameterSetName = "byName")]
    [switch]$InheritWaitForHeartbeatFromHost,
    [Parameter(ParameterSetName = "byID")]
    [Parameter(ParameterSetName = "byName")]
    [switch]$UnspecifiedStartOrder,
    [Parameter(ParameterSetName = "byID")]
    [Parameter(ParameterSetName = "byName")]
    [switch]$WaitForHeartBeat
)
Process {
    $vmServer = $null
    try {
        [string[]]$Properties = @('VirtualMachineName', 'StartAction', 'StartDelay', 'StopAction', 'StopDelay', 'IsStartDelayInherited', 'IsStopActionInherited', 'IsStopDelayInherited', 'IsWaitForHeartbeatInherited')
        $vmServer = Connect-VIServer -Server $VIServer -Credential $VICredential -ErrorAction Stop
        $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        if ($PSCmdlet.ParameterSetName -eq "byID") {
            $machine = Get-VM -Server $vmServer -Id $VMId -ErrorAction Stop
        }
        else {
            $machine = Get-VM -Server $vmServer -Name $VMName -ErrorAction Stop
        }
        $poli = Get-VMStartPolicy -Server $vmServer -VM $machine -ErrorAction Stop
        $cmdArgs = @{ ErrorAction = 'Stop'; StartPolicy = $poli; Confirm = $false }
        if ($StartDelay -gt 0) { $null = Set-VMStartPolicy @cmdArgs -StartDelay $StartDelay }
        if ($StopDelay -gt 0) { $null = Set-VMStartPolicy @cmdArgs -StopDelay $StopDelay }
        if ($StartOrder -gt 0) { $null = Set-VMStartPolicy @cmdArgs -StartOrder $StartOrder }
        if ($PSBoundParameters.ContainsKey('StartAction')) { $null = Set-VMStartPolicy @cmdArgs -StartAction $StartAction }
        if ($PSBoundParameters.ContainsKey('StopAction')) { $null = Set-VMStartPolicy @cmdArgs -StopAction $StopAction }
        if ($PSBoundParameters.ContainsKey('UnspecifiedStartOrder')) { $null = Set-VMStartPolicy @cmdArgs -UnspecifiedStartOrder:$UnspecifiedStartOrder }
        if ($PSBoundParameters.ContainsKey('WaitForHeartBeat')) { $null = Set-VMStartPolicy @cmdArgs -WaitForHeartBeat $WaitForHeartBeat }
        if ($PSBoundParameters.ContainsKey('InheritStartDelayFromHost')) { $null = Set-VMStartPolicy @cmdArgs -InheritStartDelayFromHost:$InheritStartDelayFromHost }
        if ($PSBoundParameters.ContainsKey('InheritStopActionFromHost')) { $null = Set-VMStartPolicy @cmdArgs -InheritStopActionFromHost:$InheritStopActionFromHost }
        if ($PSBoundParameters.ContainsKey('InheritStopDelayFromHost')) { $null = Set-VMStartPolicy @cmdArgs -InheritStopDelayFromHost:$InheritStopDelayFromHost }
        if ($PSBoundParameters.ContainsKey('InheritWaitForHeartbeatFromHost')) { $null = Set-VMStartPolicy @cmdArgs -InheritWaitForHeartbeatFromHost:$InheritWaitForHeartbeatFromHost }
        $result = Get-VMStartPolicy -Server $vmServer -VM $machine -ErrorAction Stop | Select-Object $Properties
        foreach ($item in $result) {
            $item | Add-Member -NotePropertyName 'Timestamp' -NotePropertyValue $timestamp -Force
            Write-Output $item
        }
    }
    catch { throw }
    finally { if ($null -ne $vmServer) { Disconnect-VIServer -Server $vmServer -Force -Confirm:$false -ErrorAction SilentlyContinue } }
}

IP address or DNS name of the vSphere server

PSCredential object for authenticating with the server

ID of the virtual machine

Name of the virtual machine

VM start action: None or PowerOn

Default start delay in seconds

Number defining the VM start order

Default stop action: None, Suspend, PowerOff, or GuestShutdown

Default stop delay in seconds

Off

Inherit start delay from the host

Off

Inherit stop action from the host

Off

Inherit stop delay from the host

Off

Inherit wait for heartbeat from the host

Off

No specific start order defined

Off

VM should start after receiving a heartbeat

An interactive directory of PowerShell scripts.