-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRemove-AzureBulkDeleteResource.ps1
140 lines (107 loc) · 4.54 KB
/
Remove-AzureBulkDeleteResource.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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
$VerbosePreference = "SilentlyContinue"
Function BulkDeleteResource {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True)]
[object[]]$ResourcesToRemove,
[Parameter(Mandatory=$False)]
[switch]$BreakGlass = $False
)
BEGIN {
$ManagedResourceTypes = @(
"Microsoft.Compute/virtualMachines"
"Microsoft.Compute/virtualMachines/extensions"
"Microsoft.Compute/availabilitySets"
"Microsoft.Network/networkInterfaces"
"Microsoft.Network/publicIPAddresses"
"Microsoft.Network/networkSecurityGroups"
"Microsoft.Compute/disks"
"Microsoft.Storage/storageAccounts"
"Microsoft.Network/virtualNetworks"
)
$VerbosePreference = "continue"
}
PROCESS
{
Write-Verbose "Cleaning up any old jobs..."
Get-Job | Remove-Job
foreach ($ManagedResourceType in $ManagedResourceTypes)
{
Write-Verbose "Processing Resource Type $($ManagedResourcetype)"
$ResourcesToRemove |
Where-Object { $_.Resourcetype -eq $ManagedResourceType} |
ForEach-Object {
Write-Verbose "Deleting $($_.Name)"
If ($BreakGlass -eq $True)
{
$_ | Remove-AzResource -Force -AsJob
}
Else
{
$_ | Remove-AzResource -Force -WhatIf
}
}
If ($ResourcesToRemove | Where-Object { $_.Resourcetype -eq $ManagedResourceType}) {
Write-Verbose "Waiting from removal jobs to complete..."
Get-Job | Wait-Job
Write-Verbose "Receiving Jobs..."
Get-Job | Receive-Job
Write-Verbose "Jobs are done!"
Get-Job | Remove-Job
}
$ResourcesToRemove = $ResourcesToRemove | Where-Object { $_.Resourcetype -ne $ManagedResourceType}
}
If ($ResourcesToRemove.Count -gt 0)
{
Write-Verbose "Processing Resource Type OTHER"
$ResourcesToRemove |
ForEach-Object {
Write-Verbose "Deleting $($_.Name)"
If ($BreakGlass -eq $True)
{
$_ | Remove-AzResource -Force -AsJob
}
Else
{
$_ | Remove-AzResource -Force -WhatIf
}
}
If ($ResourcesToRemove) {
Write-Verbose "Waiting from removal jobs to complete..."
Get-Job | Wait-Job
Write-Verbose "Receiving Jobs..."
Get-Job | Receive-Job
Write-Verbose "Jobs are done!"
Get-Job | Remove-Job
}
}
} #End PROCESS
} #End BulkDeleteResource
#If not logged in to Azure, start login
if ($Null -eq (Get-AzContext).Account) {
$AzureEnv = Get-AzEnvironment | Select-Object -Property Name |
Out-GridView -Title "Choose your Azure environment. NOTE: For Azure Commercial choose AzureCloud" -OutputMode Single
Connect-AzAccount -Environment $AzureEnv.Name }
$SubSelection = Get-AzSubscription | Out-GridView -Title "Select a Subscription" -OutputMode Single
Set-AzContext -Subscription $SubSelection
$RGSelection = Get-AzResourceGroup | Out-GridView -Title "Select Resource Group" -OutputMode Single
$ResourceSelection = Get-AzResource -ResourceGroupName $RGSelection.ResourceGroupName | Out-GridView -Title "Select Resources to Remove" -OutputMode Multiple
$ResourceSelection = $ResourceSelection | Out-GridView -Title "Re-Select Resources to Remove" -OutputMode Multiple
If ($ResourceSelection.Count -eq 0) {Break}
Write-Host "Performing Remove-AzResource -WhatIF on all selected resouces to incite fear" -ForegroundColor Cyan
Start-Sleep -Seconds 10
BulkDeleteResource $ResourceSelection
If ($ResourceSelection) {
Write-Host "Resources selected for deletion:"
$ResourceSelection | ft -Property Name,ResourceGroupName,Location,ResourceType -AutoSize
}
Write-Host "Number of resources selected for deletion: $($ResourceSelection.Count)"
Write-Host "`nType ""BreakGlass"" to Remove Resources, or Ctrl-C to Exit" -ForegroundColor Green
$HostInput = $Null
$HostInput = Read-Host "Final Answer"
If ($HostInput -eq "BreakGlass" ) {
BulkDeleteResource $ResourceSelection -BreakGlass
} Else {
Write-Host "Existing..."
Break
}