ForEach-Object возвращает все объекты три раза в powershell (Azure VM) - PullRequest
0 голосов
/ 26 марта 2020

У меня есть строка Powershell, в которой должны быть перечислены все виртуальные машины из выбранной подписки, и у меня всего 3 подписки.

$azureSubscriptionID = "xxxxx-xxxxx-xxxxx-xxxx"
foreach ($subs in $azureSubscriptionID)
    {
        Write-Output "Collecting VM facts from subscription $subs"

         $vms += Get-AzureRMSubscription | ForEach-Object {Select-AzureRMSubscription $_ | Out-Null; Get-AzureRmVM -WarningAction SilentlyContinue} 
    }

Проблема заключается в том, что при запуске сценария и использовании $ vms он перечисляет все доступные подписки vms три раза подряд, например:

VM A VM B VM C ВМ А ВМ В ВМ C ВМ А ВМ В ВМ C

Что я делаю не так и как это исправить? или есть альтернативные способы получить все VMS от подписки X в несколько строк? Используя это в Azure runbook.

1 Ответ

2 голосов
/ 26 марта 2020

Если вы просто хотите просмотреть все свои подписки и перечислить все виртуальные машины, вы можете сделать следующее:

Get-AzureRMSubscription | ForEach-Object {
    $sub = Select-AzureRMSubscription $_
    Write-Output "Collecting VM facts from subscription $($sub.Subscription.Id)"
    Get-AzureRmVM
}

Проблема с вашей попыткой состоит в том, что вы получаете все подписки (Get-AzureRmSubscription) во время каждой итерации l oop независимо от значений, содержащихся в $azureSubscriptionID. Чтобы исправить ваш код, вам нужно запустить Get-AzureRMSubscription -SubscriptionId $subs или Select-AzureRMSubscription -SubscriptionId $subs.


Если вы хотите продолжить обработку с собранными вами данными, я бы рассмотрел какой-то альтернативный подход, когда вы явно нацелены на известные подписки.

$azureSubscriptionIDs = "xxxxx-xxxxx-xxxxx-xxxx","yyyyy-yyyyy-yyyyy-yyyy","zzzzz-zzzzz-zzzzz-zzzz"
# $vms is an array of custom objects
# each custom object contains a subscription ID and the associated VMs Names
$vms = foreach ($sub in $azureSubscriptionIDs) {
    $null = Select-AzureRMSubscription -SubscriptionId $sub
    $subvms = Get-AzureRmVM | Select -Expand Name
    $sub | Select @{n='Subscription';e={$_}},@{n='VMs';e={$subvms}}
}
# You can access the subscription ID now with the Subscription property
# You can access the VMs Names with the VMs property
# List all vms under subscription 'xxxxx-xxxxx-xxxxx-xxxx'
$vms | Where Subscription -eq 'xxxxx-xxxxx-xxxxx-xxxx' | Select -Expand VMs
# List all vms for each subscription with a custom console message
foreach ($sub in $vms) {
    Write-Output "Here are all the VMs for subscription $($sub.Subscription)"
    $sub.VMs
}
...