Functions/LabVM/Remove-LabVM.ps1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
#Requires -Version 5.0 function Remove-LabVM { [CmdletBinding(DefaultParameterSetName = 'MachineName', SupportsShouldProcess = $true, ConfirmImpact = 'High')] param ( [Parameter(Mandatory = $true, ParameterSetName = 'Machine', ValueFromPipeline = $true)] [LabMachine[]]$Machine, [Parameter(Mandatory = $true, Position = 0, ParameterSetName = 'MachineName')] [string[]]$MachineName, [Parameter(Mandatory = $true, ParameterSetName = 'Environment', ValueFromPipeline = $true)] [LabEnvironment[]]$Environment, [Parameter(Mandatory = $false)] [switch]$RemoveFromDomain, [Parameter(Mandatory = $false)] [switch]$Force #[Parameter(Mandatory = $false, ParameterSetName = 'MachineName')] #[string]$DomainController, #[Parameter(Mandatory = $false, ParameterSetName = 'MachineName')] #[PSCredential]$DomainCredential ) Begin { if (-not (Test-Administrator)) { throw 'Please run this command as Administrator.' } } Process { if ($($PSCmdlet.ParameterSetName) -eq 'MachineName') { if ($MachineName) { $Machine = Get-LabMachine -Name $MachineName } else { $Machine = Get-LabMachine } } elseif ($($PSCmdlet.ParameterSetName) -eq 'Environment') { $Machine = Get-LabMachine -Environment $Environment } if (-not $Machine) { return } foreach ($m in $Machine) { $vm = Get-VM | Where-Object { $_.Name -eq $m.Name } if ($vm) { if ($Force -or $PSCmdlet.ShouldProcess($m.Name)) { Write-Verbose -Message "Removing lab-VM '$($m.Name)'..." if ($vm.State -eq 'Running') { Stop-VM -VM $vm -Force while ($vm.State -ne 'Off') { Start-Sleep -Seconds 1 } } $path = $vm.ConfigurationLocation Remove-VM -VM $vm -Force Start-Sleep -Seconds 2 try { Get-ChildItem -Path (Join-Path -Path $path -ChildPath '*') -Directory | ForEach-Object { try { [System.IO.Directory]::Delete($_.FullName, $true) } catch { Start-Sleep -Seconds 3 } } try { [System.IO.Directory]::Delete($path, $true) } catch { Start-Sleep -Seconds 3 [System.IO.Directory]::Delete($path, $true) } } catch { Write-Error -Message $_ } Write-Verbose -Message "Finished removing lab-VM '$($m.Name)'" if ($RemoveFromDomain) { try { Write-Verbose -Message 'Removing machine '$($m.Name)' from domain...' Remove-LabVMFromDomain -Machine $m Write-Verbose -Message "Finished removing machine '$($m.Name)' from domain." } catch { Write-Warning -Message 'Removing machine from domain failed.' } } } else { Write-Error -Message "Confirmation denied for removing '$($m.Name)'; skipped removing lab-VM" } } else { Write-Verbose -Message "VM '$($m.Name)' not found; skipped removing lab-VM" } } } } |