我创建了一个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会话上进行的。
答案 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