You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:15:00