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)
}
我想列出在特定时间范围或计费周期内产生成本的所有 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)
}