VBScript嵌套字典子字典赋值到父字典后值为空问题求助
问题定位与解决
以下是导致SiSConObj取值为空的常见原因及修复方案:
1. 访问嵌套字典对象时遗漏Set关键字
VBScript中存取对象类型的变量(包括Dictionary对象)时,必须使用Set关键字。如果你读取SiSConObj中存储的ResDictObj时没有加Set,会默认取对象的默认属性(无匹配默认属性时返回空值),误以为存储的值为空。
错误写法示例:
Dim getVal getVal = SiSConObj("你的拼接Key") ' 错误,存储的是对象,不能直接赋值
正确写法:
Dim getVal Set getVal = SiSConObj("你的拼接Key") ' 正确,用Set接收对象类型
2. 拼接的Key值无效或匹配错误
你使用ServerName & "-" & ResDictObj.Item("_id")作为SiSConObj的Key,如果出现以下情况会导致后续取值时匹配不到Key,返回空:
ServerName变量未赋值、值为空- ResDictObj中不存在
_id这个Key:VBScript的Dictionary访问不存在的Key时会自动插入该Key,值为Empty,最终拼接出来的Key和你预期的不一致
你可以在添加前打印拼接的Key确认有效性:
Dim curKey curKey = ServerName & "-" & ResDictObj.Item("_id") MsgBox "当前使用的Key为:" & curKey ' 确认Key是否符合预期 SiSConObj.add curKey, ResDictObj
3. If分支未触发或原字典本身无数据
- 你注释说明ResDictObj、HostDictObj分别存储查询结果和主机信息,但你提供的代码中只有字典初始化逻辑,没有写入数据的步骤,请确认两个字典在判断前已经正确写入了对应Key的数据
- 直接用
HostDictObj.item("sname") = ResDictObj.item("_name")做判断存在风险:如果两个字典的对应Key不存在,会自动插入值为Empty的Key,此时Empty = Empty会返回True,后续赋值的两个字段也会是Empty,但不会导致整个ResDictObj为空。建议先判断Key是否存在再做比较:
If HostDictObj.Exists("sname") And ResDictObj.Exists("_name") Then If HostDictObj.item("sname") = ResDictObj.item("_name") Then ResDictObj.add "_snapshot_hostName" , HostDictObj.item("_snapshot_hostName") ResDictObj.add "_fullyQualifiedTarget" , HostDictObj.item("_fullyQualifiedTarget") End If End If
4. 重复添加同Key触发错误被忽略
如果你的代码中开启了On Error Resume Next,当SiSConObj添加重复Key时会静默失败,不会抛出错误,也不会写入数据。建议添加前先判断Key是否存在:
If Not SiSConObj.Exists(curKey) Then SiSConObj.add curKey, ResDictObj Else MsgBox "Key" & curKey & "已存在" End If
内容的提问来源于stack exchange,提问作者user17206036
相关产品推荐
相关产品推荐

