Windows 11 更新后运行 wmic,如果看到“不是内部或外部命令”或 PowerShell 提示找不到该命令,不要先把它当成 PATH 故障。微软在 2026 年 8 月更新的支持文档中确认:WMIC 已从 Windows 11 移除,24H2、25H2 会随 2026 年 8 月预览更新进入这一变化,26H1 已移除;底层 WMI 仍然存在。真正要做的是找到仍调用 wmic.exe 的脚本和工具,把查询迁移到 Get-CimInstance、把方法调用迁移到 Invoke-CimMethod,再核对输出格式、退出码、权限与远程连接。

先判断是不是“命令消失”
先在目标电脑上做两个只读检查:
Get-Command wmic -ErrorAction SilentlyContinue
where.exe wmic
两条命令都没有返回路径,并且系统版本已经进入上述移除范围时,优先按 WMIC 移除处理。不要从旧系统手工复制 wmic.exe 和关联文件,也不要只改 PATH:这样既不能保证组件、别名和注册信息完整,也会把后续更新风险留给运维人员。
这里要区分两个名字:WMIC 是旧的命令行包装器,WMI 是 Windows 管理基础设施。微软移除前者,没有移除后者,所以原来查询 Win32_Process、Win32_OperatingSystem 等类的能力仍可通过 PowerShell CIM 或程序接口使用。

版本到达时间并不等于所有电脑同一天变化。24H2、25H2 的表述是纳入 2026 年 8 月预览更新,设备是否已经安装对应更新仍需逐台确认。微软页面还提供了一个官方 wmic_dlc 临时缓解包,用于仍被旧应用阻塞的工作流;它需要管理员权限并修改当前进程的执行策略。这个包适合短期恢复兼容,不是长期替代方案,使用前应经过组织审批,并同时设定迁移完成日期。
先盘点依赖,不要逐条碰运气
从明确的脚本目录开始搜索,不要无边界扫描整个系统盘。下面的 PowerShell 命令会查找常见脚本和配置文件中的 WMIC 调用:
$root = 'C:\Ops\Scripts'
Get-ChildItem $root -Recurse -File -Include *.bat,*.cmd,*.ps1,*.vbs,*.js,*.xml,*.json,*.ini |
Select-String -Pattern '\bwmic(?:\.exe)?\b'
除了文件内容,还要检查任务计划程序、部署平台、监控探针、登录脚本和第三方应用文档。二进制程序内部调用 WMIC 时,文本搜索可能找不到;这类依赖应向供应商确认版本,或在测试机上通过进程监控和应用日志定位。
| 旧调用类型 | 迁移目标 | 优先核对 |
|---|---|---|
| 读取系统、进程、BIOS、磁盘信息 | Get-CimInstance |
字段名、空值、排序、数字单位 |
| 调用 WMI 类或实例方法 | Invoke-CimMethod |
参数类型、返回码、权限和副作用 |
| 批处理解析 WMIC 表格文本 | PowerShell 对象再转 JSON/CSV | 编码、分隔符、引号和退出码 |
| 远程 WMIC | CimSession |
WSMan/DCOM、防火墙、认证和超时 |
| 第三方程序内置调用 | 供应商升级或临时缓解 | 支持版本、替换计划和停用期限 |
查询型命令先改成 Get-CimInstance
查询迁移最稳妥的做法是先保留原来的 WMI 类与字段,只替换访问方式;确认结果一致后,再优化筛选和输出。以下都是只读查询:
| 旧 WMIC | PowerShell CIM |
|---|---|
wmic path Win32_Process get Name,ProcessId |
Get-CimInstance Win32_Process | Select-Object Name,ProcessId |
wmic os get Caption,Version,BuildNumber |
Get-CimInstance Win32_OperatingSystem | Select-Object Caption,Version,BuildNumber |
wmic computersystem get Manufacturer,Model |
Get-CimInstance Win32_ComputerSystem | Select-Object Manufacturer,Model |
wmic bios get SerialNumber |
Get-CimInstance Win32_BIOS | Select-Object SerialNumber |
wmic logicaldisk where "DriveType=3" get DeviceID,FreeSpace,Size |
Get-CimInstance Win32_LogicalDisk -Filter 'DriveType = 3' | Select-Object DeviceID,FreeSpace,Size |

wmic path win32_process get Name 改为 Get-CimInstance Win32_Process | Select-Object Name。截图核验于 2026-08-24。来源:Microsoft Support,https://support.microsoft.com/en-us/servicing/os/windows/docs/2025/09/windows-management-instrumentation-command-line-wmic-removal-from-windowsPowerShell 输出的是对象,不是 WMIC 的固定宽度文本。这通常更可靠,但会破坏依赖空格、列位置或本地化标题的旧解析器。给机器读取时,应主动定义输出契约,例如:
Get-CimInstance Win32_OperatingSystem |
Select-Object Caption,Version,BuildNumber |
ConvertTo-Json -Compress
如果下游读取 CSV,应固定编码、列顺序和分隔符,并在样本中加入空值与非 ASCII 字符。不要把 Format-Table 的显示文本继续当数据接口。
方法调用改用 Invoke-CimMethod
旧命令中出现 call 时,通常不是查询,而是在调用 WMI 方法。迁移前先确认它是否会启动或结束进程、修改服务、改网络配置或触发安装;这类命令不应在生产机上直接试跑。
例如,读取某个进程所有者可以先取得实例,再调用只读的 GetOwner 方法:
$process = Get-CimInstance Win32_Process -Filter 'ProcessId = 1234'
$owner = Invoke-CimMethod -InputObject $process -MethodName GetOwner
$owner | Select-Object Domain,User,ReturnValue
迁移其他方法时,使用 Get-CimClass 和官方类文档确认方法名、参数及返回值,不要只按 WMIC 文本位置机械改写。涉及变更系统状态的操作,应先在隔离测试机中验证,并让脚本对非零 ReturnValue 明确失败。
批处理兼容的难点是输出和退出码
暂时不能把 .bat 全部改成 .ps1 时,可以从 CMD 调用 Windows PowerShell:
powershell.exe -NoLogo -NoProfile -NonInteractive -Command ^
"$ErrorActionPreference='Stop'; try { Get-CimInstance Win32_OperatingSystem | Select-Object Caption,Version,BuildNumber | ConvertTo-Json -Compress; exit 0 } catch { Write-Error $_; exit 1 }"
if errorlevel 1 exit /b %errorlevel%
如果组织已经部署 PowerShell 7,可把入口改为 pwsh.exe,但不要用 Get-WmiObject 作为新的长期依赖:PowerShell 7 已移除旧 WMI v1 cmdlet,CimCmdlets 才是跨 Windows PowerShell 5.1 与 PowerShell 7 更稳妥的方向。
批处理迁移至少要固定四件事:标准输出只放机器需要的数据;诊断信息走错误流;成功和失败都有明确退出码;脚本运行时不加载用户 Profile。命令中包含引号、管道或百分号时,优先把逻辑放进签名或受控的 .ps1 文件,避免在多层 CMD 引号里继续堆叠。
远程调用不能只换命令名
旧 WMIC 远程调用常依赖 DCOM,而 New-CimSession 的常见路径是 WSMan。两者对防火墙、认证、端口和权限的要求不同,所以“本机查询相同”不代表远程部署就能直接通过。
- 先在单台测试机上创建
CimSession,验证名称解析、认证和最小权限。 - 如果目标环境暂时只能使用 DCOM,可评估
New-CimSessionOption -Protocol Dcom,但应把它记录为兼容路径,而不是默认放宽防火墙。 - 对批量主机设置连接超时、失败清单和重试上限,不能让一台离线设备卡住整个任务。
- 不要为了迁移方便把账号加入更高权限组;先找出具体类和方法需要的权限。
测试与回滚要比较“契约”,不只比较画面
仍有 WMIC 的测试机可以并行运行旧、新命令,把结果保存为两个样本。比较时至少覆盖:
- 字段是否齐全,空值、数组和时间格式是否变化;
- 对象数量、筛选范围和排序是否一致;
- 标准输出、错误输出与退出码是否符合调用方预期;
- 普通用户、管理员、计划任务服务账号是否表现一致;
- 本机与远程、在线与离线目标是否能在限定时间内结束;
- 中文设备名、用户名和路径是否出现编码问题。
回滚不是把新系统硬塞回旧组件,而是保留上一版脚本、配置开关和已知可用的运行环境。若第三方程序还没有更新,可在审批后使用微软临时缓解包维持短期运行,同时记录负责人、适用主机和停用日期。等新脚本通过验收后,再移除旧调用和临时兼容层。
最小迁移清单
- 确认目标设备的 Windows 版本、更新状态和
wmic实际路径。 - 在限定目录、任务计划、部署平台和第三方工具中盘点 WMIC 依赖。
- 查询型调用迁移到
Get-CimInstance,方法型调用迁移到Invoke-CimMethod。 - 为机器读取定义 JSON/CSV 等稳定格式,不再解析表格显示文本。
- 显式处理错误流、返回值、退出码、编码、权限和远程协议。
- 用旧、新结果样本验收,并保留可执行的脚本级回滚。
- 临时缓解包只用于阻塞性兼容问题,并设定迁移截止时间。
如果你只是手动查一次系统信息,替换命令通常几分钟就能完成;如果 WMIC 嵌在部署、监控或第三方程序里,真正的工作量在调用链和输出契约。先盘点、再分类、最后逐项验收,才能避免把“命令找不到”修成更隐蔽的自动化故障。
官方资料
- Microsoft Support:WMIC removal from Windows
https://support.microsoft.com/en-us/servicing/os/windows/docs/2025/09/windows-management-instrumentation-command-line-wmic-removal-from-windows - Microsoft Learn:使用 Get-CimInstance 取得 WMI 对象
https://learn.microsoft.com/zh-tw/powershell/scripting/samples/getting-wmi-objects–get-ciminstance-?view=powershell-7.5 - Microsoft Learn:Windows PowerShell 5.1 与 PowerShell 7.x 的差异
https://learn.microsoft.com/en-us/powershell/scripting/whats-new/differences-from-windows-powershell?view=powershell-7.5
© 版权声明
本站部分内容源于网络收集,文章等版权归原作者所有,若需删稿请联系管理员邮箱:satomini@warpnav.com
相关文章
暂无评论...