PowerShell管道中哈希表查询数据库名称取值失败求助
解决PowerShell哈希表索引无法获取值的问题
作为PowerShell新手碰到这种“哈希表明明填好了却拿不到值”的问题确实挺闹心的,我来帮你捋清楚问题出在哪,以及怎么解决。
问题根源
你在定义DBName计算属性时用了$ht.$($_.dbid)这种点符号访问方式,但这里的哈希表键是整数类型的database_id——点符号是用来访问对象属性的,而哈希表的索引访问必须用方括号[]。当你用点符号时,PowerShell会把数字键当成属性名称去查找,自然找不到对应的值,所以DBName才会为空。
修正后的代码
只需要把哈希表的访问方式改成方括号索引就能解决问题,完整修正后的代码如下:
$ht = @{} Invoke-Sqlcmd -ServerInstance $dsname -Query "SELECT id = database_id, name = name FROM sys.databases" | Select-Object id, name | ForEach-Object { $ht.Add($_.id, $_.name) } $DBCCShrinkOutput += Invoke-Sqlcmd -ServerInstance $dsname -Database master -InputFile $DBCCFile | Select-Object @{n="Instance";e={$dsname}}, @{n="DBName";e={$ht[$_.dbid]}}, FileID, CurrentSize, MinimumSize, UsedPages, EstimatedPages | Sort-Object
额外小提示
- 你可以在填充哈希表后加一行
$ht来验证键值对,甚至用$ht.Keys | Get-Member确认键的类型,确保和$_.dbid的类型一致(都是整数),避免因类型不匹配导致的索引失败。 - 为了应对哈希表中没有对应键的情况(比如某个
dbid不存在于sys.databases中),可以给表达式加个默认值,比如:@{n="DBName";e={$ht[$_.dbid] ?? "Unknown Database"}},这样即使找不到对应值也不会显示空。
内容的提问来源于stack exchange,提问作者Dave




