如何在PowerShell foreach循环中关联带共同前缀的哈希表键值对
按共同前缀分组处理PowerShell哈希表中的密钥对
首先可以优化你的密钥获取代码,减少不必要的Azure API调用:
$keyvaultName = 'KeyVaultName' # 一次性获取带明文值的密钥,无需重复调用Get-AzKeyVaultSecret $secrets = Get-AzKeyVaultSecret -VaultName $keyvaultName -AsPlainText $keys = @{} foreach ($secret in $secrets) { $keys[$secret.Name] = $secret.SecretValueText }
接下来是核心的分组处理逻辑,这里提供两种可行方案:
方案一:提取唯一前缀后遍历处理
- 先从哈希表的所有键中提取出唯一的前缀:
$uniquePrefixes = $keys.Keys | ForEach-Object { # 按最后一个'-'拆分键名,获取前缀部分 $parts = $_ -split '-', 2 if ($parts.Count -eq 2) { $parts[0] } } | Select-Object -Unique
- 遍历每个前缀,关联对应的三个密钥值并执行任务:
foreach ($prefix in $uniquePrefixes) { # 定义当前前缀对应的三个密钥键名 $appIdKey = "$prefix-appid" $idKey = "$prefix-id" $secretKey = "$prefix-secret" # 确保三个密钥都存在,避免执行任务时出错 if ($keys.ContainsKey($appIdKey) -and $keys.ContainsKey($idKey) -and $keys.ContainsKey($secretKey)) { # 获取对应的值 $appId = $keys[$appIdKey] $id = $keys[$idKey] $secret = $keys[$secretKey] # 替换为你的实际任务代码 Write-Host "正在处理前缀 [$prefix] 的密钥组:" Write-Host " AppID: $appId" Write-Host " ID: $id" Write-Host " Secret: $secret" } else { Write-Warning "前缀 [$prefix] 缺少必要密钥(appid/id/secret),跳过处理" } }
方案二:用Group-Object直接分组
直接通过Group-Object按前缀对密钥键进行分组,再遍历分组处理:
# 按前缀分组所有密钥键 $keyGroups = $keys.Keys | Group-Object { $parts = $_ -split '-', 2 if ($parts.Count -eq 2) { $parts[0] } else { $_ } } foreach ($group in $keyGroups) { $prefix = $group.Name $groupKeys = $group.Group # 检查组内是否包含三个必要密钥 if ($groupKeys -contains "$prefix-appid" -and $groupKeys -contains "$prefix-id" -and $groupKeys -contains "$prefix-secret") { $appId = $keys["$prefix-appid"] $id = $keys["$prefix-id"] $secret = $keys["$prefix-secret"] # 执行你的特定任务 Write-Host "正在处理分组 [$prefix]:" Write-Host " AppID: $appId" Write-Host " ID: $id" Write-Host " Secret: $secret" } else { Write-Warning "分组 [$prefix] 不完整,缺少必要密钥,跳过" } }
关键说明
- 使用
-split '-', 2拆分键名是为了兼容前缀中包含'-'的场景(比如my-app-appid会被拆分为前缀my-app),如果你的前缀确定不含'-',可以简化为($_ -split '-')[0]。 - 增加密钥存在性检查是为了避免因缺失某个密钥导致的运行时错误。
内容的提问来源于stack exchange,提问作者Malakondaiah
相关产品推荐
相关产品推荐

