PowerShell结果数组重复输出

时间:2018-12-10 13:18:42

标签: arrays json azure 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

第一个运行输出显示为(请注意,“ 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会话上进行的。

1 个答案:

答案 0 :(得分:5)

重复输出来自以下事实:无论IF条件如何,都在循环之后添加$objAlready$objNow。像这样将这些对象添加到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