首页 > 解决方案 > 在 foreach 中使用 if 时 Powershell 获得相同的值

问题描述

我正在尝试从 Azure 获取指标到 Zabbix。

问题是 VM 的 Metric 由 2 个单词组成:Percentage CPU,而 Zabbix 不允许项目键由 2 个单词组成。我也尝试过Percentage%20CPU,但在 Zabbix 中出现错误,我创建了 Zabbix key percentage_cpu

所以我决定事先将数据从 Zabbix 发送到 Azure 以“翻译”percentage_cpuPercentage%20CPU. 如果仅存在该键,则此方法非常有用,但是当我添加另一个键(在此示例 SQL 指标中)时,问题就开始了。

对于 SQL 指标,所有值都在一个词中 - 无需更改任何内容,但随后 VM 指标也分配给 SQL。我试图避免为每个服务编写单独的文件

     $host_items = Get-ZabbixHostItems -url $zabbix_url -auth $zabbix_auth - 
 zabbix_host $host_name  
    foreach ($host_item in $host_items) 

    { 

        #$host_item_details = select-string -InputObject $host_item.key_ -Pattern '^(azure\.sql)\.(.*)\.(.*)\[\"(.*)\"\]$'; 

        $host_item_details = select-string -InputObject $host_item.key_ -Pattern '^(azure\.\w{2,})\.(.*)\.(.*)\[\"(.*)\"\,(.*)]$'; 

        #$host_item_details = select-string -InputObject $host_item.key_ -Pattern '^(azure)\.(.*)\.(.*)\.(.*)\[\"(.*)\"\,(.*)]$'; 

        $host_item_provider = $host_item_details.Matches.groups[1]; 

        $host_item_metric = $host_item_details.Matches.groups[2]; 

        $host_item_timegrain = $host_item_details.Matches.groups[3]; 

        $host_item_resource = $host_item_details.Matches.groups[4]; 

        $host_item_suffix = $host_item_details.Matches.groups[5]; 


         if ($host_item_metric='percentage_cpu')
          {$host_item_metric='Percentage%20CPU'}
          else

          { $host_item_metric = $host_item_details.Matches.groups[2];}
      #}



        $uri = "https://management.azure.com{0}/providers/microsoft.insights/metrics?api-version={1}&interval={2}&timespan={3}&metric={4}" -f ` 

            $host_item_resource, ` 

            "2017-05-01-preview", ` 

            $host_item_timegrain.ToString().ToUpper(), ` 

            $($(get-date).ToUniversalTime().addminutes(-15).tostring("yyyy-MM-ddTHH:mm:ssZ") + "/" + $(get-date).ToUniversalTime().addminutes(-2).tostring("yyyy-MM-ddTHH:mm:ssZ")), ` 


            $host_item_metric; 


        write-host $uri; 
      }

hostitems_的输出

azure.sql.dtu_consumption_percent.pt1m["/subscriptions/111-222/resourceGroups/rg/providers/Microsoft.Sql/servers/mojsql/databases/test",common]
azure.vm.percentage_cpu.pt1m["/subscriptions/111-222/resourceGroups/rg/providers/Microsoft.Compute/virtualMachines/test",common]

当我在上面运行代码时,我得到了这些 URI

https://management.azure.com/subscriptions/111-222/resourceGroups/rg/providers/Microsoft.Sql/servers/mojsql/databases/test/providers/microsoft.insights/m
etrics?api-version=2017-05-01-preview&interval=PT1M&timespan=2018-08-11T07:38:05Z/2018-08-11T07:51:05Z&metric=Percentage%20CPU


https://management.azure.com/subscriptions/111-222/resourceGroups/rg/providers/Microsoft.Compute/virtualMachines/test/providers/microsoft.insights/metric
s?api-version=2017-05-01-preview&interval=PT1M&timespan=2018-08-11T07:38:05Z/2018-08-11T07:51:05Z&metric=Percentage%20CPU

对于第一个链接(SQL)指标应该是dtu_consumption,但我得到两个链接的相同指标

第二次尝试:

if ($host_item_metric -eq 'percentage_cpu')
          {$host_item_metric='Percentage%20CPU';}
          else

          { $host_item_metric = $host_item_details.Matches.groups[2];}

      write-host $host_item_metric
    }

输出:(原始值)

dtu_consumption_percent
percentage_cpu

标签: azurepowershell

解决方案


不得不使用 -like

if ($host_item_metric -like 'percentage_cpu')
          {$host_item_metric='Percentage%20CPU';}
          else

          { $host_item_metric = $host_item_details.Matches.groups[2]}

推荐阅读