做自动化测试和测控系统的人,基本都躲不开National Instruments的软件。LabVIEW、TestStand、NI-VISA、NI-DAQmx这一整套东西,装的时候还算顺畅,但到了卸载环节,各种诡异问题就全冒出来了。驱动版本不对要换,软件升级前要清旧版,甚至只是想让另一块采集卡正常工作,都可能在卸载这一步卡住。我自己在设备调试现场遇到过不止一次:控制面板里把LabVIEW卸得干干净净,一装新版驱动就提示“版本冲突”,最后只能翻注册表手动清理,折腾一个下午。后来把NI软件家族的结构和官方卸载工具的用法摸透了,才终于总结出一套从准备、卸载到清理残局的完整流程,这篇就好好聊一聊。
无论你是还在用LabVIEW做开发的工程师,还是负责多台上位机软件维护的运维人员,这篇内容都能帮你少走很多弯路。我会先把NI软件“为什么难卸载”的根本原因讲清楚,再带你把三种常规卸载方式、官方清理工具的使用边界、以及卸载失败时的排查思路全部过一遍。
1. 先搞明白:NI软件为什么这么难卸干净
1.1 NI产品不是一个软件,而是一张依赖网
很多人听到“NI软件”脑子里只有一个LabVIEW,但真实情况远没这么简单。NI的产品线覆盖了上位机开发环境、测试管理、实时系统、硬件驱动和公共运行时,常见的就有下面这一大批:
| 组件类型 | 典型软件 | 主要作用 |
|---|---|---|
| 开发环境 | LabVIEW、LabWindows/CVI、Measurement Studio | 编写测试和控制程序 |
| 测试管理 | TestStand、VeriStand、DIAdem | 搭建自动化测试序列、数据管理 |
| 硬件驱动 | NI-DAQmx、NI-VISA、NI-488.2 | 驱动采集卡、仪器总线、GPIB设备 |
| 仪器驱动 | NI-SCOPE、NI-FGEN、NI-RFSA、NI-DMM | 驱动示波器、信号源、射频设备 |
| 公共运行时 | NI Common Runtime、NI License Manager | 多软件共享的基础运行支撑 |
问题的关键在于,LabVIEW运行时、硬件驱动和公共组件之间存在非常复杂的引用关系。比如NI-DAQmx在安装时会调用LabVIEW Runtime的某些DLL,而NI-VISA又可能被TestStand依赖。普通的“添加/删除程序”根本不会分辨这些依赖关系,它只会傻傻地删除自己负责的部分,导致其他软件引用的共享文件被删掉,或者反过来——因为检测到仍有软件引用就不删除,留下大量垃圾。
1.2 残留的三个重灾区:共享组件、许可证、注册表
根据我的实际清理经验,NI软件卸载后残留最严重的地方就是这三个:
第一是共享公共组件。NI Common Runtime、NI License Manager、NI Error Reporting这类东西,安装时会在Program Files\National Instruments下写入大量公共文件。当你卸载某个上层软件时,卸载器会检查公共组件是否还被其他软件引用。这个检查逻辑经常出bug,导致该删的没删,不该删的却删了。
第二是许可证文件。NI的软件很多需要激活,激活信息会写入许可证管理器。传统卸载流程经常会保留许可证文件,表面看是贴心帮你保留授权,实际上在换版本或换硬件时,这些残留的授权记录会和新版本的授权检测机制冲突,导致新装好的软件反而提示“许可证无效”。
第三是注册表。NI软件在注册表里写下的键值多到吓人,设备枚举键、服务项、驱动过滤项、COM组件注册信息全都有。手动卸载基本清不干净,而这些残留注册表项正是新版本安装时报“安装程序检测到已安装版本”的元凶。
1.3 残留会带来什么实际后果
卸不干净不是小事,它会直接造成几个非常典型的故障场景:
- 新驱动装上后,设备管理器里硬件仍显示旧版本,或者干脆变成“未知设备”。
- 新版LabVIEW启动时加载了旧版本的DLL,直接崩溃或报错“LabVIEW VI memory corruption”。
- 安装新驱动到一半提示“需要更高版本NI-VISA”,但旧版却卸不掉。
- 许可证冲突,明明花钱买了正版授权,软件却要求重新激活。
这些情况在现场最耽误时间,因为光看错误提示根本定位不到根因。所以正确的思路是:在动手卸载之前,就把卸载当作一个“项目”来管理,而不是双击几下就完事。
2. 动手卸载前,先把这三件事做完
2.1 备份许可证、配置和项目依赖信息
很多人一上来就点卸载,卸完才发现LabVIEW授权没了、MAX里保存的硬件配置也没了。我现在的习惯是,任何操作前先做一个备份清单。
需要备份的东西主要有三类:
- NI软件的激活信息。如果用的是正版授权,记录序列号和激活状态。NI License Manager里能导出许可证备份,建议生成一份。
- MAX配置。打开NI Measurement & Automation Explorer,把已连接设备的通道配置、任务配置、系统配置截图或导出保存。特别是PXI机箱的触发路由、cRIO控制器的IP设置,这些配置重建非常麻烦。
- 项目依赖清单。工程里用了哪些NI模块、哪些驱动版本,最好列一个表格。这样卸载后重新安装时可以按清单装回来,不会漏掉。
另外建议用“控制面板->卸载程序”查看已安装的NI软件完整清单,截图保存。后面清理残留时,你需要知道这台机器原本到底装了什么。
2.2 停止NI相关服务和进程
卸载过程中最常见的失败原因就是文件被占用。NI的大量后台服务会在开机时自动运行,比如NI Application Web Server、NI License Manager、NI PSP Server Locator、NI Update Service这些。如果你不把它们停掉,卸载器删除文件时就会报访问拒绝。
操作顺序是这样的:
- 按
Win + R,输入services.msc打开服务管理器。 - 把所有名称带NI、National Instruments为前缀的服务逐个选中,右键停止。
- 在服务上双击,把启动类型改为“禁用”,防止卸载过程中服务被自动拉起。
- 打开任务管理器,结束所有带NI前缀的进程。
- 如果电脑装了NI的采集设备驱动,建议先正常弹出并拔掉USB设备,再去停止服务。
这里有个细节容易被忽略:NI的TRACE Engine和NI WMI Provider这两个服务,即使你结束了进程,也可能在被调用的瞬间重新启动。停掉后最好再检查一次任务管理器,确认没有NI进程残留,再进行下一步。
2.3 创建还原点,给系统留一条退路
这一步很多人觉得多余,但实际遇到过一次卸载到一半系统崩溃,你就会发现还原点有多重要。NI软件卸载过程中会大规模操作Windows Installer和注册表,万一新老版本驱动冲突,或者公共运行库被误删,系统可能连设备管理器都打不开。
创建还原点的方法很简单:
- 在“此电脑”上右键,选择“属性”。
- 进入“系统保护”,选择系统盘,点击“创建”。
- 输入一个清楚的还原点名称,比如“卸载NI_LabVIEW_2020前”。
我个人的建议是,如果电脑里有PXI系统或cRIO控制器相关配置,且设备很贵、配置很难重建,直接再做一次磁盘镜像备份也不为过。磨刀不误砍柴工。
3. 常规卸载的正确打开方式
3.1 首选:用NI Package Manager卸
NI Package Manager(NIPM)是NI后来主推的包管理工具,它最大的价值是维护了已安装软件包之间的依赖关系。以前用Windows Installer卸载经常出现“这个组件被其他产品引用”的报错,NIPM会把整棵依赖树都理清楚。
具体步骤:
- 打开NIPM,在左侧选择“已安装的软件(INSTALLED PRODUCTS)”。
- 勾选需要卸载的软件。如果多个软件都要卸,可以一次性全勾上,但要注意版本依赖关系。
- 点击右上角的“卸载(UNINSTALL)”按钮,等待执行完成。
- 根据提示重启电脑。
使用NIPM时有一个很重要的经验:把上层应用先勾掉,驱动层后勾。NIPM虽然会处理依赖,但如果你同时选中了LabVIEW和NI-DAQmx,它可能会先卸驱动再卸LabVIEW,导致LabVIEW的卸载过程找不到LIB文件夹直接报错。我习惯分两批操作,第一批卸LabVIEW、TestStand这种应用层软件,第二批再卸各类驱动和运行时。
3.2 备选:用Windows应用和功能卸载
如果你的NI软件是老版本,或者安装时根本没有接入NIPM,那就得回到Windows自带的“应用和功能”里卸载。这一步看起来简单,但有三个坑要注意。
第一,卸载顺序必须从上层往下层走。正确顺序是:开发环境(LabVIEW)→ 测试管理(TestStand)→ 具体硬件驱动(NI-DAQmx、NI-VISA)→ 公共组件(Common Runtime、License Manager)。反着卸的结果往往是底层先删了,上层卸载时找不到安装目录,导致假卸载,软件名称消失了,文件全留在硬盘里。
第二,同一个硬件驱动的多个版本会同时出现在列表里。比如NI-DAQmx既有18.1又有15.5,建议先把低版本卸掉,再卸高版本。高版本通常覆盖了低版本的共享DLL,如果高版本先卸,低版本的卸载程序会因为缺失运行库而中断。
第三,每个软件卸载完成后,先别急着卸下一个,建议重启一次再继续。NI的驱动加载机制比较特殊,卸载后驱动服务并没有立即停止,重启才能让驱动彻底从内核卸载,不然下一个软件卸载时还会碰到占用。
3.3 命令行卸载方式(适合批量环境)
如果你要处理的是几十台甚至上百台电脑,比如产线上的工控机批量升级,肯定不能一台台去点。这种情况下,用命令行方式卸载就非常高效。
NI老版本的卸载支持Windows Installer,可以通过msiexec静默卸载。找出产品码的方法是:
- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall。 - 如果系统是64位,32位软件的卸载项在
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall。 - 逐个查看“DisplayName”,找到NI相关软件后记录其“ProductCode”值。
拿到产品码后,用以下命令进行静默卸载:
msiexec /x {89FDC6A1-6C2B-4C42-B7D8-9A2F2410D25E} /qn /norestart参数说明:/x表示卸载,/qn表示无界面静默执行,/norestart表示完成后不自动重启。
对于新版本软件,NIPM本身也提供了命令行支持。在命令行下执行nipm uninstall加上产品名,可以卸载指定软件。比如:
nipm uninstall labview_2023_Q1 -u-u参数代表无人值守模式。这个方法我在现场维护时经常用,比一个个打开界面快太多。不过小心一点,命令行卸载不会弹出错误对话框,一旦失败只会把错误码写进日志。所以批量操作时务必先跑完日志检查,再推送给所有机器。
4. 常规卸载之后,用NI官方清理工具做深度清扫
4.1 NI Cleanup Utility到底是个什么工具
NI Cleanup Utility也曾经叫NI Clean Up Utility,是National Instruments官方提供的一个免费小工具。它的用途非常明确:扫描系统中与NI相关的文件、文件夹、注册表项、服务和驱动,把常规卸载后留下的残余信息全部清掉。
这个工具和第三方卸载软件最大的区别在于,它完全了解NI软件自家的目录结构和注册表布局,扫出来的内容都是有针对性的。它不是暴力删除,而是知道哪些是残留、哪些必须保留。所以我的建议很直接:只认官方的免费工具,不要用其他“强力卸载”软件去扫NI。
下载渠道有两个:NI官网的下载中心直接搜索“NI Cleanup Utility”,或者从NI官方支持页面进入下载页面。需要注意的是,不要去第三方下载站,更不要用网盘分享链接。官方工具免费放开下载,任何要求“打赏”或“关注”后下载的版本都要警惕是否被植入恶意程序。
4.2 使用流程与关键步骤
整个工具的使用流程不复杂,但每一步都有值得注意的细节:
- 先重复第2章的准备工作,关闭NI进程和服务,拔掉NI硬件设备。
- 以管理员身份运行Cleanup Utility。
- 工具会自动扫描已安装的NI产品、驱动和残留项,界面会列出扫描结果。
- 勾选需要清理的范围,通常默认全选即可。
- 点击清理后,工具会执行文件删除和注册表清理。
- 清理完成后,工具会提示重启电脑,务必重启,不要跳过。
实测下来,这个工具处理得最干净的部分是注册表。它会把NI软件在HKLM\Software\National Instruments、HKLM\Software\WOW6432Node\National Instruments和HKCU\Software\National Instruments下残留的项删除。把常规卸载后“找不到卸载程序”的垃圾项目清理得很彻底。
有一个小技巧:如果你下载到的是带命令行的版本,可以在清理时带参数生成日志。命令形如:
NICleanupUtility.exe --log日志会记录删除的每一个文件路径和注册表项。普通用户不需要逐条看,但这个日志在你后续遇到问题需要找官方技术支持时非常有用。
4.3 工具边界:它不会替你做的三件事
说清楚这个工具的边界,反而能避免大家对它产生不切实际的期待。
第一,它不会清理你的用户数据。Documents\LabVIEW Data、My Documents\National Instruments下面的工程文件、VI文件、报表数据都会原封不动地留下。这不是缺陷,而是有意设计,避免误删你的工作成果。
第二,它不会清理NI硬件的固件。比如cRIO控制器、PXI机箱里的FPGA bit文件、智能相机里的固件,这些存储在硬件非易失性存储器里的东西,软件卸载完全不影响。你不用担心把NI软件卸了会导致设备变砖,这是两个独立层面。
第三,它不会帮你解决硬件驱动的内核残留问题。部分老的NI驱动会在系统目录下释放sys内核文件,如果这些驱动处于活动状态,工具也无法删除,需要你到设备管理器里手动卸载设备驱动。如果设备已经被识别为“未知设备”,还要在设备管理器->查看->显示隐藏设备里找一遍。
5. 卸载失败和残留问题,我这样一步步排查
5.1 有日志先看日志,别瞎猜
很多人在卸载报错后第一时间就去翻注册表,这是最没有效率的做法。NI的每个安装卸载动作基本都有日志,要么在临时目录,要么在ProgramData下面。常见日志路径有:
C:\ProgramData\National Instruments\NIPackageManager\logs\C:\Program Files\National Instruments\NIUninstaller\logs\%TEMP%\NIUninstall\
打开日志后,优先搜索“Error”或者退出码。下面几个错误码我在实际工作中遇到频率很高:
| 错误码 | 含义 | 排查方向 |
|---|---|---|
| 0x80070643 | Windows Installer无法正常执行 | 检查Windows Installer服务是否启用 |
| 0x80070005 | 权限不足 | 确认是否以管理员身份运行 |
| 0x80070020 | 文件正被占用 | 检查NI服务和进程是否真的全部结束 |
| 2755 | 安装脚本损坏 | 多半是安装缓存目录被清理过,需要下载安装包重新修复 |
5.2 手动清理残留文件与注册表项
官方工具跑完之后仍然有残留,这种情况在混合版本的老机器上确实存在。此时只能手动清理,但必须遵循“先备份、后删除”的原则。
文件层面,优先检查这几个路径:
C:\Program Files\National InstrumentsC:\Program Files (x86)\National InstrumentsC:\ProgramData\National Instruments%APPDATA%\National Instruments
注册表层面,主要看以下位置:
HKEY_LOCAL_MACHINE\SOFTWARE\National InstrumentsHKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\National InstrumentsHKEY_CURRENT_USER\SOFTWARE\National Instruments
手动清理时,我用的是“按图索骥”法:不凭借记忆乱删,而是先运行一次卸载安装包,让它报出具体冲突的文件路径或注册表键名,然后再去对应的路径排查。比如安装新版NI-VISA时提示“已有的NIVisaServer服务存在”,我就直接去服务管理器里找到这个名字的服务并删除,而不是把整个NI注册表目录统统干掉。
这里特别强调一个容易误伤的点:National Instruments目录下除了软件本体,还包含设备校准数据、仪器驱动文件。如果你在清理之后又重新安装了同型号仪器,这些校准数据宁可保留也不要删。只删软件版本相关、DLL和exe文件就好。
5.3 重装新版时反复报“旧版仍存在”,怎么办
这个问题的隐蔽性很高,NIPM已经显示软件全部卸载完,文件也清理干净了,但安装新版时就是提示旧版残留。碰到这种情况,问题多半出在NIPM自己的状态数据库里,而不是文件系统。
解决思路是进入NIPM安装目录,找到它的本地数据库文件(一般在C:\ProgramData\National Instruments\NIPackageManager\packages下),备份后清理掉相关包记录。或者更简单,直接在NIPM菜单里执行“验证安装(VERIFY)”操作,让它重新比对实际已安装软件和数据库记录的差异。验证完成后,如果发现不一致,NIPM会自行修复状态,这时候再重新运行卸载,通常就能把假残留清掉。
如果验证也没有效果,就需要在注册表的Uninstall键下搜索包含“NI”的显示名称,看看是不是有孤儿卸载条目没有清除干净。这类键值大多藏在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall下,Windows以哪个用户身份运行的卸载程序,就可能把条目写到哪个用户下。
5.4 最后兜底:系统还原和干净重装
如果尝试了以上所有方法,NI软件还是在系统中留有不稳定因素,比如其他非NI软件也出现打不开的情况,那么最理性的选择就是恢复系统还原点。这也是为什么我在第2章强调创建还原点的原因。
恢复还原点会丢失还原点创建之后安装的所有软件和设置,但如果卸载NI软件过程中破坏了系统级运行库,恢复系统往往比继续清理更快。还有一种场景是机器上装了非常多NI组件,牵扯到多种硬件不支持重装,此时最稳妥的做法就是通过系统镜像做一次干净恢复,然后从备份清单里按需装回软件。这个选择听起来很“笨”,但实际上的时间成本远低于和残留问题反复缠斗。
6. 这些年实际踩过的坑和最终沉淀的做法
6.1 第三方卸载工具要慎用,尤其是带“强力卸载”字样的
我理解大家看到“强制卸载”功能时的那种想要省事的心情,但第三方卸载工具在处理NI这类带硬件驱动的软件时,经常会把服务端的驱动级信息直接删掉。表面看卸得很干净,实际上设备管理器里的NI硬件驱动已经被破坏,后续想再装回原版驱动都很困难。NI自己的工具确实比较“温和”,但它懂NI软件的卸载顺序和依赖逻辑,这是第三方工具没法比的。
所以我的经验是:NI官方体系内的软件,优先用官方卸载工具;实在要动注册表,也是先排查看清楚再动,而不是直接用“强制卸载”一把梭。
6.2 换大版本前建议“清场”,裸奔升版本最容易翻车
很多时候大家不只是单纯想卸载NI软件,而是想从LabVIEW 2020升级到LabVIEW 2023。这种场景下,直接在两版NI软件同机共存,风险非常高。NI不同大版本之间有很多同名DLL文件,后者会直接覆盖前者,导致旧工程打开后加载到新版本库文件而崩溃。
我现在固定操作流程是:
- 记录当前已安装NI软件的清单和激活信息。
- 按依赖顺序卸载旧版本全部NI软件。
- 运行NI Cleanup Utility清理残留。
- 重启后手动检查残留文件与注册表。
- 再安装新版本NI软件。
- 用备份清单逐个恢复驱动和模块,最后重新激活授权。
一套流程走下来,虽然耗时大半天,但基本能保证新系统环境的稳定,不至于第二天上线又冒出兼容性问题。
6.3 团队批量维护时,把卸载步骤脚本化
如果负责的设备数量超过十台,靠手工去一台台走上面的流程根本不现实。我的建议是把卸载流程脚本化,尤其是在产线设备镜像统一的情况下,直接用批处理结合NIPM命令行和msiexec静默卸载,可以大幅压缩维护窗口。
脚本大致逻辑是:
# 先停服务 net stop "NIApplicationWebServer" net stop "NILicenseManager" # 卸载上层软件 nipm uninstall labview_2023_Q1 -u # 卸载驱动 nipm uninstall nidaqmx_2023_Q1 -u # 对老版本用msiexec卸载 msiexec /x {89FDC6A1-6C2B-4C42-B7D8-9A2F2410D25E} /qn /norestart执行完后安排一次重启,再远程推送NI Cleanup Utility的静默清理。需要注意的是,产线电脑上通常有其他工装软件依赖NI运行时,批量卸载前我至少会先确认一遍,哪些机器必须保留NI-VISA或NI-DAQmx,避免一锅端把还在正常跑的测试工位都给卸废了。
6.4 想清楚这个问题,卸载就不再麻烦
其实NI软件难卸载的根源,并不在于系统复杂到没办法处理,而在于我们经常把它当成一个普通软件去卸载,忽略了它的组件化特性和依赖关系。只要理解底层逻辑,先把进程和服务管好,再按依赖顺序卸载,最后用官方工具做收尾清扫,这套方法论放在任何版本的LabVIEW、NI-DAQmx上都成立。
我自己现在遇到NI软件卸载问题,第一反应已经不是“完蛋了”,而是照着固定流程一步步走。流程跑顺了,反而觉得比很多桌面软件的卸载更可控,至少你知道每一步会动到系统哪些位置,出了状况也能顺着日志倒推回去。希望这篇文章能帮你少踩几个坑,如果实际操作中还有更好用的方法,也欢迎按自己的经验再补充调整。