我想列出在特定时间段或计费周期内产生成本的所有虚拟机。
我设法创建了这个脚本,以获得所需的输出:
$file="C:tempGeneratedCost-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:tempGeneratedCost-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
如果看不到帐户,请确保重新运行az login
。
这是您使用azure cli only 的代码
$file="C:tempGeneratedCost-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)
}