给禁止联网的工控现场做诊断 EXE:蓝盾诊断 V2.2 的架构与踩坑
前言:工控现场的技术支持有个共同噩梦——客户产线出问题,现场没外网、没 Python、操作员不会敲命令,故障只能靠电话里描述"就是……不太对"。于是我做了「蓝盾诊断」:一个单文件 EXE,现场双击就能跑完一轮网络/系统/安全/硬件检查,输出一份能直接发回来的报告。V2.2 版本的一些架构决策和踩坑记录如下。
一、为什么是 PowerShell 而不是 Python
工控机的典型画像:Windows 7/10、无外网、无运行库、可能连 VC++ Redistributable 都不齐。PowerShell 是唯一系统自带的解释器——Windows 7 自带 2.0,Win10 自带 5.1。用 PowerShell 写,分发成本为零。
代价是生态简陋:没有 requests、没有 json 库的舒适封装、GUI 只能自己拼。诊断工具的核心是"把几十个检查命令组织起来",WPF + XAML 内嵌就能做出体面的界面,不需要引入任何外部依赖。
二、三个架构决策
1. Runspace 异步,别让 UI 冻死
诊断里有 ping、端口探测、WMI 查询,任何一个都可能卡 30 秒。如果直接在 UI 线程跑,窗口直接"未响应"。解法是 Runspace 池异步执行,UI 线程只管刷新进度:
2. 模块级 watchdog
EXE 在客户现场最怕两件事:卡死和"看起来跑完了但什么都没输出"。每个诊断模块包一层 watchdog——超时强制终止并记录"该模块超时",保证整个流程必定走到报告输出。宁可报告里有一行"安全检查超时",也不能让整个 EXE 白跑。
3. 三种自检模式
发布前自测是工控工具的生死线。V2.2 内置三档:SelfTest(纯逻辑,不碰系统)、AsyncTest(验证 Runspace 池)、GuiProbe(拉起真窗口点一遍按钮)。每次改完代码三档全跑,打包前再跑一遍——现场没有第二次机会。
三、打包踩坑
用 ps2exe 打包时踩了两个坑:
- 杀软误报:ps2exe 生成的 EXE 是常见的误报对象。解法是给 EXE 签名 + 提交微软白名单申诉,另一条路是分发
.ps1+ 一个两行的启动.bat,现场执行策略用-ExecutionPolicy Bypass -File绕过;
- 版本兼容:脚本里用了 PS7 才有的语法(如三元运算符),在 Win7 的 5.1 上直接解析失败——EXE 还没跑就崩。最终坚持全脚本兼容 5.1,用
if/else替代所有 PS7 语法。
四、输出设计
报告是自包含 HTML:每个模块一张表,失败项标红附修复建议,末尾一段"给远程工程师的摘要"。现场人员唯一要做的就是把这个 HTML 发回来。
五、总结
工控工具的设计约束和互联网产品完全相反:不是"功能多",而是"在 10 年前的系统上、由非技术用户、一次成功"。PowerShell 单文件、异步防卡死、watchdog 兜底、三档自检——每一层都是为了"现场没有第二次机会"。
(完)环境:Windows 7/10 / PowerShell 5.1 / ps2exe / 2026-10 实测
- 点赞
- 收藏
- 关注作者
评论(0)