能否用变量存储输入值并调用PowerShell哈希表对应值?
PowerShell哈希表取值失败问题解决
问题根源
你的代码核心问题是哈希表键的类型不匹配:
- 哈希表
$AppGroupsHash的键是整数类型(1、2、3、4) - 通过
Read-Host获取的输入是字符串,分割后$AppGroupsKey也是字符串类型 - 用
-ccontains比较时,字符串"1"和整数1属于不同类型,条件不成立,导致取值代码$AppGroupsHash.($AppGroupsKey)根本没执行
修复方案
有两种简单的解决思路,选一种即可:
方案1:将输入的字符串键转换为整数
在循环中把用户输入的字符串转换为整数,同时添加输入合法性校验,避免无效输入报错:
# 定义哈希表(键为整数) $AppGroupsHash = @{ 1 = "AppADGroup1" 2 = "AppADGroup2" 3 = "AppADGroup3" 4 = "AppADGroup4" } # 修正显示选项的错误(之前重复写了AppADGroup1) Write-Host "`n1 = AppADGroup1`n2 = AppADGroup2`n3 = AppADGroup3`n4 = AppADGroup4`n " -ForegroundColor Yellow # 获取用户输入 $AppGroupsKeys = Read-Host "Enter App Hash values (1 - 2 - 3 - 4) (No space, delimit with ';') " foreach ($keyStr in $AppGroupsKeys.Split(';')) { # 安全转换字符串为整数,避免无效输入报错 if ([int]::TryParse($keyStr.Trim(), [ref]$keyInt)) { if ($AppGroupsHash.ContainsKey($keyInt)) { Write-Host "选中键: $keyInt" # 正确取值并输出 $targetGroup = $AppGroupsHash[$keyInt] Write-Host "对应AD组: $targetGroup" # 这里添加将用户加入AD组的逻辑,示例: # Add-ADGroupMember -Identity $targetGroup -Members "TargetUserName" } else { Write-Host "错误:键 $keyInt 不存在" -ForegroundColor Red } } else { Write-Host "错误:输入的 '$keyStr' 不是有效数字" -ForegroundColor Red } }
方案2:将哈希表的键改为字符串类型
直接把哈希表的键定义为字符串,这样输入的字符串可以直接匹配,无需类型转换:
# 哈希表键改为字符串类型 $AppGroupsHash = @{ "1" = "AppADGroup1" "2" = "AppADGroup2" "3" = "AppADGroup3" "4" = "AppADGroup4" } Write-Host "`n1 = AppADGroup1`n2 = AppADGroup2`n3 = AppADGroup3`n4 = AppADGroup4`n " -ForegroundColor Yellow $AppGroupsKeys = Read-Host "Enter App Hash values (1 - 2 - 3 - 4) (No space, delimit with ';') " foreach ($key in $AppGroupsKeys.Split(';')) { $cleanKey = $key.Trim() if ($AppGroupsHash.ContainsKey($cleanKey)) { Write-Host "选中键: $cleanKey" Write-Host "对应AD组: $($AppGroupsHash[$cleanKey])" # Add-ADGroupMember -Identity $($AppGroupsHash[$cleanKey]) -Members "TargetUserName" } else { Write-Host "错误:键 '$cleanKey' 不存在" -ForegroundColor Red } }
补充说明
你之前尝试的write-host "$AppGroupsHash.$AppGroupsKey;"返回System.Collections.Hashtable.1;,是因为直接拼接哈希表对象时,PowerShell会输出它的类型名称。正确的取值方式是$AppGroupsHash[$key]或$AppGroupsHash.($key),前提是键的类型必须匹配。
内容的提问来源于stack exchange,提问作者Timm770
相关产品推荐
相关产品推荐

