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
| function Get-AzureCostAnalysis { [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string[]]$SubscriptionIds, [datetime]$StartDate = (Get-Date).AddDays(-30) )
$report = [PSCustomObject]@{ Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss' ResourceAnalysis = @() CostRecommendations = @() }
foreach ($subId in $SubscriptionIds) { Set-AzContext -SubscriptionId $subId | Out-Null $resources = Get-AzResource | Where-Object { $_.ResourceType -notin @('Microsoft.Resources/deployments','Microsoft.Resources/subscriptions') }
$resourceGroups = $resources | Group-Object ResourceGroupName foreach ($rg in $resourceGroups) { $costData = Get-AzConsumptionUsageDetail -StartDate $StartDate -EndDate (Get-Date) -ResourceGroup $rg.Name $report.ResourceAnalysis += [PSCustomObject]@{ Subscription = $subId ResourceGroup = $rg.Name TotalCost = ($costData | Measure-Object PretaxCost -Sum).Sum UnderutilizedVMs = $rg.Group.Where{ $_.ResourceType -eq 'Microsoft.Compute/virtualMachines' }.Count } } }
$report.ResourceAnalysis | ForEach-Object { if ($_.UnderutilizedVMs -gt 5) { $report.CostRecommendations += [PSCustomObject]@{ Recommendation = "调整资源组 $($_.ResourceGroup) 中未充分利用的VM规模" PotentialSavings = "预计节省 $([math]::Round($_.TotalCost * 0.3)) 美元" } } }
$report | Export-Excel -Path "$env:TEMP/AzureCostReport_$(Get-Date -Format yyyyMMdd).xlsx" return $report }
|