Массив результатов PowerShell дублирует вывод

Я создал сценарий if / else, который выводит некоторые результаты в массив и преобразует их в JSON. Я немного сбит с толку, почему я получаю повторяющиеся результаты при запуске скрипта. У кого-нибудь есть идеи, почему?

Мой сценарий:

$DynatraceTenantID = "asdf"
$DynatraceToken = "asdf"
$DynatraceServer = "asdf"

$TagName = "pmack"
$TagValue = "pmack"

$result_array_installed_already = @()
$result_array_installed_now = @()

$vms = Get-AzureRmResource -TagName $TagName -TagValue $TagValue | Where-Object {$_.ResourceType -like "Microsoft.Compute/virtualMachines"}

Foreach ($vm in $vms) {
    $vm1 = Get-AzureRmVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name
    $vm2 = $vm1.Extensions
    if ($vm2.Publisher -notcontains "dynatrace.ruxit"){
        Set-AzureRmVmExtension `
            -Name "Dynatrace" `
            -Publisher "dynatrace.ruxit" `
            -ResourceGroupName "$($vm1.ResourceGroupName)" `
            -Location "$($vm1.Location)" `
            -VMName "$($vm1.Name)" `
            -ExtensionType "oneAgentWindows" `
            -TypeHandlerVersion "2.3" `
            -Settings @{ "tenantId"=$DynatraceTenantID; "token"=$DynatraceToken;"server"=$DynatraceServer; }
        $objNow = New-Object -TypeName psobject -Property @{
            VMaltered = $($vm1.Name)
            IDaltered = $($vm1.Id)
            }
        } else {
            $objAlready = New-Object -TypeName psobject -Property @{
                VMinstalled = $($vm1.Name)
                IDinstalled = $($vm1.Id)
            }
        }

        $result_array_installed_already += $objAlready
        $result_array_installed_now += $objNow
    }

$result_array_installed_already | ConvertTo-Json

$result_array_installed_now | ConvertTo-Json

И результат 1-го запуска отображается как (обратите внимание, что имя pmackVM дублируется):

RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
                         True         OK OK          
[
    {
        "IDinstalled":  "/subscriptions/1221df0b-8a2e-45b3-b750-9ef61575087d/resourceGroups/pmack-container/providers/Microsoft.Compute/virtualMachines/pmackVM",
        "VMinstalled":  "pmackVM"
    },
    {
        "IDinstalled":  "/subscriptions/1221df0b-8a2e-45b3-b750-9ef61575087d/resourceGroups/pmack-container/providers/Microsoft.Compute/virtualMachines/pmackVM",
        "VMinstalled":  "pmackVM"
    }
]
{
    "IDaltered":  "/subscriptions/1221df0b-8a2e-45b3-b750-9ef61575087d/resourceGroups/pmack-container/providers/Microsoft.Compute/virtualMachines/pmackVM1",
    "VMaltered":  "pmackVM1"
}

Однако, если я закрою и снова открою PowerShell (чтобы очистить все переменные) и снова запустить его, я получаю следующий результат:

[
    {
        "IDinstalled":  "/subscriptions/1221df0b-8a2e-45b3-b750-9ef61575087d/resourceGroups/pmack-container/providers/Microsoft.Compute/virtualMachines/pmackVM
",
        "VMinstalled":  "pmackVM"
    },
    {
        "IDinstalled":  "/subscriptions/1221df0b-8a2e-45b3-b750-9ef61575087d/resourceGroups/pmack-container/providers/Microsoft.Compute/virtualMachines/pmackVM
1",
        "VMinstalled":  "pmackVM1"
    }
]

Есть идеи, почему первый вывод повторяется? Обратите внимание, что мой первый запуск был также на новом сеансе PowerShell.

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
0
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Повторяющийся вывод происходит из-за того, что вы добавляете ОБЕИ $objAlready и $objNow после цикла независимо от условия IF. Добавьте эти объекты в результирующие массивы ВНУТРИ if следующим образом:

$DynatraceTenantID = "asdf"
$DynatraceToken = "asdf"
$DynatraceServer = "asdf"

$TagName = "pmack"
$TagValue = "pmack"

$result_array_installed_already = @()
$result_array_installed_now = @()

Foreach ($vm in $vms) {
    $vm1 = Get-AzureRmVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name
    $vm2 = $vm1.Extensions
    if ($vm2.Publisher -notcontains "dynatrace.ruxit"){
        Set-AzureRmVmExtension `
            -Name "Dynatrace" `
            -Publisher "dynatrace.ruxit" `
            -ResourceGroupName "$($vm1.ResourceGroupName)" `
            -Location "$($vm1.Location)" `
            -VMName "$($vm1.Name)" `
            -ExtensionType "oneAgentWindows" `
            -TypeHandlerVersion "2.3" `
            -Settings @{ "tenantId"=$DynatraceTenantID; "token"=$DynatraceToken;"server"=$DynatraceServer; }

        $objNow = New-Object -TypeName psobject -Property @{
            VMaltered = $($vm1.Name)
            IDaltered = $($vm1.Id)
        }
        $result_array_installed_now += $objNow
    } 
    else {
        $objAlready = New-Object -TypeName psobject -Property @{
            VMinstalled = $($vm1.Name)
            IDinstalled = $($vm1.Id)
        }
        $result_array_installed_already += $objAlready
    }
}

$result_array_installed_already | ConvertTo-Json
$result_array_installed_now | ConvertTo-Json

Другие вопросы по теме