You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

额外小提示

  1. 你可以在填充哈希表后加一行$ht来验证键值对,甚至用$ht.Keys | Get-Member确认键的类型,确保和$_.dbid的类型一致(都是整数),避免因类型不匹配导致的索引失败。
  2. 为了应对哈希表中没有对应键的情况(比如某个dbid不存在于sys.databases中),可以给表达式加个默认值,比如:@{n="DBName";e={$ht[$_.dbid] ?? "Unknown Database"}},这样即使找不到对应值也不会显示空。

内容的提问来源于stack exchange,提问作者Dave

火山引擎 最新活动