PowerShell比较数组值筛选Azure订阅标签返回结果列表问题求助
问题排查与修正方案
核心错误共性
两个代码的问题根源是同一个:遍历循环时错误使用整个集合变量进行判断,而非当前遍历的单个元素,另外还有PowerShell语法和API使用的细节错误。
测试代码错误点&修正
- 错误1:循环判断条件写的
if ($aa -eq "cc"),每次判断都用整个数组$aa而非当前元素$a,PowerShell中数组和字符串做-eq比较时会返回所有匹配的元素,只要存在匹配就会被判定为$true,所以每次循环都会进入成功分支 - 错误2:
ForEach($a in $aa)语法的循环中没有自动变量$_,$_只在管道循环、ForEach-Object中生效 - 错误3:
ArrayList.Add()方法默认返回新元素的索引值,未处理返回值就会直接输出到控制台,就是你看到的0/1/2/3
修正后的测试代码:
$aa = @("aa","bb","cc", "cc") [System.Collections.ArrayList]$bbb = @() ForEach ($a in $aa){ # 判断当前遍历元素$a是否等于cc if ($a -eq "cc") { # 用[void]吞掉Add方法的返回值,避免多余输出 [void]$bbb.Add($a) Write-Host "cool cool cool" } else { Write-Host ":(" } } Return $bbb
Azure订阅标签筛选代码错误点&修正
- 错误1:遍历
$SubTags时判断条件和赋值都用了整个集合$SubTags,没有用当前元素$s - 错误2:Azure返回的
TagsProperty是哈希表(键值对结构),判断是否存在指定标签名不能用数组判断的-contains,要调用哈希表的ContainsKey()方法 - 错误3:如果要同时匹配标签名和标签值,还需要加对应值的判断,你原来的逻辑只判断了标签名是否存在
修正后的代码(同时支持标签名+值匹配,可根据需求调整):
$ArrayOfTags = @() # 可自定义要匹配的标签名和值 $targetTagName = "Environment" $targetTagValue = "Production" ForEach($s in $SubTags) { # 先判断当前订阅是否存在目标标签键 if ($s.Properties.TagsProperty -and $s.Properties.TagsProperty.ContainsKey($targetTagName)){ # 如果需要匹配标签值,取消下一行注释即可 # if ($s.Properties.TagsProperty[$targetTagName] -eq $targetTagValue) { $ArrayOfTags += $s # } } else { Write-Host "fail" } } Return $ArrayOfTags
额外优化建议
如果不想手动处理循环,也可以用PowerShell内置的Where-Object直接过滤,代码更简洁:
$ArrayOfTags = $SubTags | Where-Object { $_.Properties.TagsProperty -and $_.Properties.TagsProperty.ContainsKey("Environment") # 匹配值的话再加一行:$_.Properties.TagsProperty["Environment"] -eq "Production" }
内容的提问来源于stack exchange,提问作者Solmyr
相关产品推荐
相关产品推荐

