NSIS中nsJSON::delete删除Kestrel节点致安装程序崩溃求助
解决NSIS中nsJSON删除节点崩溃的问题
问题根源分析
1. 目标JSON存在语法错误
你提供的目标JSON有两处无效语法,这是导致nsJSON插件解析出错、进而引发崩溃的核心原因:
\"Path\": \\https\\WebPoint.pfx:路径字符串未加双引号,且反斜杠未正确转义,正确写法应为\"Path\": \"\\\\https\\\\WebPoint.pfx\"(JSON中反斜杠需用\\转义,NSIS脚本中还需再转义一次)\"urls\": https://*:6001:URL字符串未加双引号,正确写法应为\"urls\": \"https://*:6001\"
无效的JSON结构会让插件解析逻辑异常,务必先确保原始JSON格式完全合规。
2. nsJSON Delete命令用法错误
你使用的nsJSON::Delete /tree \"Kestrel\" /end写法有误:对于根级节点的删除,无需使用/tree参数,该参数仅用于嵌套节点树的遍历定位,直接指定节点名称即可完成根节点删除。
修正后的代码示例
ClearErrors ; 加载JSON文件 nsJSON::Set /file `$INSTDIR\\config\\NIEMIngestToStream-DEFAULT.appsettings.json` ${If} ${Errors} MessageBox MB_OK "Failed to load JSON file!" Abort ${EndIf} ; 更新NATS节点 nsJSON::Set `NATS` `URL` /value `\"$NATSURL\"` nsJSON::Set `NATS` `CLUSTER` /value `\"$NATSCLUSTER\"` ${If} $URLPre == \"https\" nsJSON::Set `HTTPS_PORT` /value `\"$WEBPORT\"` nsJSON::Set `urls` /value `\"https://*:443\"` ${ElseIf} $URLPre == \"http\" ; 检查Kestrel节点是否存在 nsJSON::Get /exists `Kestrel` Pop $R0 MessageBox MB_OK \"Found Kestrel: $R0\" ; 删除根级Kestrel节点 nsJSON::Delete `Kestrel` Pop $R1 MessageBox MB_OK \"Delete Kestrel result: $R1\" nsJSON::Set `urls` /value `\"http://*:80\"` nsJSON::Set `HTTPS_PORT` /value `\"\"` ${EndIf} ; 序列化并保存JSON nsJSON::Serialize /format /file `$INSTDIR\\config\\NIEMIngestToStream.appsettings.json` ${If} ${Errors} Abort \"Unable to update JSON file!\" ${EndIf}
额外调试建议
- 每次调用nsJSON命令后立即检查
${Errors},提前捕获解析或操作错误,避免错误累积到序列化阶段崩溃 - 先用JSON校验工具验证原始JSON文件的有效性,确保无语法错误
- 测试时可简化代码,先只执行加载、删除、保存三个步骤,确认基础流程正常后再添加其他节点更新逻辑
内容的提问来源于stack exchange,提问作者tcweb
相关产品推荐
相关产品推荐

