如何使用 PowerShell 跨 Azure 订阅列出资源组?

Rav*_*obo 2 powershell azure

我正在编写一个 PowerShell 脚本来列出 Azure 订阅中的资源组。

Get-AzureRmSubscription | 
select -ExpandProperty name |
 % { 
     Get-AzureRmResourceGroup | select -ExpandProperty resourcegroupname
 }
Run Code Online (Sandbox Code Playgroud)

此代码有效。它返回这样的结果。

Resource group 1     
Resource group 2
Resource group 3 
Run Code Online (Sandbox Code Playgroud)

如何调整代码以获得如下所示的输出?

Subscription 1,Resource group 1     
Subscription 1,Resource group 2
Subscription 2,Resource group 3 
Run Code Online (Sandbox Code Playgroud)

非常感谢。

mkl*_*nt0 5

笔记:

  • 此答案使用过时模块中的 cmdlet AzureRM,该模块已被跨平台Az模块取代 - 请参阅此公告

  • RoadRunner 的答案有一个使用该模块的更新解决方案Az


Get-AzureRmSubscription | 
 % { 
   $subscrName = $_.Name
   Select-AzureSubscription -Current -SubscriptionName $name
   (Get-AzureRmResourceGroup).resourcegroupname | % {     
     [pscustomobject] @{
       Subscription = $subscrName
       ResourceGroup = $_
     }
   }
 }
Run Code Online (Sandbox Code Playgroud)

注意:以上内容更改了会话的当前订阅。在您的实际代码中,您可能希望之后恢复之前的当前代码。

以上输出具有.Subscription.ResourceGroup属性的自定义对象;如果你真的只想输出字符串,请使用:
"$name,$_"


Roa*_*ner 5

添加到@mklement 的好答案中,以下是您将如何使用最新的Azure PowerShell Az 模块而不是 AzureRM:

Get-AzSubscription | ForEach-Object {
    $subscriptionName = $_.Name
    Set-AzContext -SubscriptionId $_.SubscriptionId
    (Get-AzResourceGroup).ResourceGroupName | ForEach-Object {     
        [PSCustomObject] @{
            Subscription = $subscriptionName
            ResourceGroup = $_
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要更改为活动订阅,我们可以使用 更改上下文Set-AzContext,并传递SubscriptionIdFrom Get-AzSubscription。还应该能够通过使用Set-AzContext -Subscription $subscriptionName.

如果要使用 Az 模块运行 AzureRM 命令,可以运行Enable-AzureRmAlias,这允许您将 AzureRM 前缀与 Az 模块一起使用。

  • 你不能同时运行它们;但是,Az 可以有一个别名来识别 AzureRm。只需运行 Enable-AzureRmAlias -Scope CurrentUser (2认同)