Azure PowerShell - 从所有订阅中获取 VM 使用情况

Azure PowerShell - get VM usage from across all subscriptions

我想列出在特定时间范围或计费周期内产生成本的所有 VM。

我设法创建了这个脚本以获得所需的输出:

$file="C:\temp\GeneratedCost-short.csv"

(az consumption usage list `
--start-date "2020-07-01" --end-date "2020-07-31" | ConvertFrom-Json)`
| Where-Object {$_.product -Match "Virtual Machines"}`
| Sort-Object -Property instanceName -Descending | Select-Object instanceName, subscriptionName`
| Get-Unique -AsString | ConvertTo-Csv -NoTypeInformation | Set-Content $file

但这只会给我当前订阅的输出。

如何 运行 我在 azure 租户上的所有订阅?

我尝试使用以下版本,但它似乎不起作用:

$file="C:\temp\GeneratedCost-short.csv"

$VMs = @()
$Subscriptions = Get-AzSubscription
foreach ($sub in $Subscriptions) {
    Get-AzSubscription -SubscriptionName $sub.Name | az account set -s $sub.Name
    $VMs += (az consumption usage list --start-date "2020-07-01" --end-date "2020-07-03" | ConvertFrom-Json)
}
# 
$VMs | Where-Object {$_.product -Match "Virtual Machines"}`
| Sort-Object -Property instanceName -Descending | Select-Object instanceName, subscriptionName`
| Get-Unique -AsString | ConvertTo-Csv -NoTypeInformation | Set-Content $file

有什么建议吗?

如果未在两者之间检索帐户,则混合使用 Azure PowerShell 模块和 Azure CLI 可能会导致您的代码出现问题。验证 az cli 是否具有正确的订阅

az account list -o table

如果您没有看到帐户,请务必 re-run az login

这是您仅使用 azure cli 的代码

$file="C:\temp\GeneratedCost-short.csv"

$VMs = @()
az account list -o json | ConvertFrom-Json |
    ForEach-Object {
        Write-Host "Getting usage for account: " $_.Name
az account set -s $_.Name
    $VMs += (az consumption usage list --start-date "2020-07-01" --end-date "2020-07-03" | ConvertFrom-Json)
    }

$VMs | Where-Object {$_.product -Match "Virtual Machines"} |
    Sort-Object -Property instanceName -Descending |
        Select-Object instanceName, subscriptionName |
            Get-Unique -AsString | ConvertTo-Csv -NoTypeInformation |
                Set-Content $file

永远不要在数组上做 +=,最糟糕的模式。

[System.Collections.Generic.List[PSObject]]$VMs = @()
$subs = Get-AzSubscription # | Where-Object {$_.State -eq 'Enabled'}
foreach ($s in $subs) {
  Set-AzContext -SubscriptionObject $s | Out-Null
  $vm = # your search here ...
  $VMs.Add($vm)
 }