【问题标题】:What can I do about "WMIC is deprecated"?对于“WMIC 已弃用”,我该怎么办?
【发布时间】:2019-07-20 04:41:53
【问题描述】:

我一直依赖这两个命令:

wmic memorychip get capacity        // Outputs how much RAM there is (in a convoluted manner).
wmic diskdrive get Status,Model     // Checks whether the HDDs/SSDs on the system are (supposedly) still "OK" and working.

今天,我随便输入了“wmic”,看看能不能得到上述命令的 JSON 输出。它以红色文本打印的第一件事是:

WMIC is deprecated.

我对此感到非常震惊。已弃用?好吧...那我绝对不应该依赖它。那么,这两个命令的“现代替代方案”是什么?它们甚至存在吗?为什么他们只是告诉我们它已“弃用”,更多信息为零?

【问题讨论】:

  • 我要求 WMIC 的替代品——不是 cmd.exe...
  • WMIC 是访问 WMI 的命令行工具。 WMIC 已弃用。继续使用 PowerShell 访问 WMI。
  • @PeterMortensen,wmic.exe 用于批处理脚本脚本,因为 CMD 没有使用 WMI 来检查和管理系统的内置功能。
  • 微软旧的命令行工具的一个问题是文本编码是一团糟。一些程序使用 OEM 代码页输出,一些使用 ANSI 代码页,一些使用当前控制台输入或输出代码页,还有一些可以做 UTF-16,但通常只能到磁盘文件(例如 wmic.exe)。我很高兴看到这种临时混乱的工具被弃用了。 PowerShell 及其 cmdlet 和 .NET 是一个更好的命令行环境。 (也就是说,它对经典标准 I/O 的支持非常糟糕。它将自己作为管道中的中间人注入并重定向到文件,以便将字节转码为文本。)

标签: windows command-line-interface wmic


【解决方案1】:

如 cmets 中所述,WMIC 是用作与 WMI 通信的接口的实用程序。被弃用的不是 WMI 本身,而是“只是”接口。由于微软正在推动 PowerShell,我相信官方的继任者 wmic 将是 PowerShell commandlet Get-WmiObject。如何使用它可以在微软文档中找到:LINK

[更新] 正如评论中正确指出的那样,commandlet Get-WmiObject 最终也可能在某一天失效,因此可能不鼓励使用它以使脚本具有未来的证明。最好的方法是Get-CimInstance,它的语法与Get-WmiObject 几乎相同。请参阅 Microsoft 文档:LINK

对于您的特定情况,PowerShell 替代方案如下:

wmic memorychip 获取容量

Get-CimInstance -ClassName Win32_PhysicalMemory | Select-Object capacity

wmic diskdrive 获取状态、型号

Get-CimInstance -ClassName Win32_diskdrive | Select-Object status, model

wmic 中的命令通常派生自 WMI 类名,但这并不是真正的经验法则。使用 PowerShell 时,您通过 WMI 的真实类名访问 WMI,因此如果需要,您可能需要寻找其他类。

正如 Bacon Bits 在评论中提到的那样。可以通过命令获得真正 WMI 类的 WMIC 别名:

wmic.exe alias list brief

PowerShell 相对于wmic 无可争议的优势在于输出是一个对象,您可以轻松地继续使用输出,而 wmic 仅返回一个您最终需要解析的字符串,例如在脚本中使用时会带来例如的另一个好处输出格式 - 您可以轻松地重新格式化任何输出,例如您提到的 JSON,只需将您的命令通过另一个管道传递到 commandlet ConvertTo-Json,您就会得到预期的输出。

示例:

Get-CimInstance -ClassName Win32_diskdrive | select status, model | ConvertTo-JSON

输出:

{
    "status":  "OK",
    "model":  "SAMSUNG MZNTY256HDHP-000L7"
}

希望对你有帮助

[更新 2.2.2022] 由于这是 Google 上针对该主题弹出的第一个链接,因此这里有一个小的更新:

Microsoft 在其WMIC documentation 中正式通知 wmic 将被弃用

微软页面引用:

从 Windows 10 版本 21H1 和 Windows Server 的 21H1 半年频道发布开始,不推荐使用 WMI 命令行 (WMIC) 实用程序。此实用程序已被用于 WMI 的 Windows PowerShell 取代。此弃用仅适用于 WMI 命令行 (WMIC) 实用程序; Windows Management Instrumentation (WMI) 本身不受影响。

为了未来的证明脚本,我仍然会坚持使用 PowerShell 的工业 CIM 标准

【讨论】:

  • 请注意,您可以使用 wmic.exe alias list brief 获得别名和实际 WMI 类名的交叉路口。
  • 这不好。我有一个需要 wmic.exe 的 startnet.cmd 脚本,微软会开始调用 startnet.ps1 吗?对于上下文。 startnet.cmd 是 winpe 启动时调用的脚本。
  • @RichardMeadows 我个人对 winpe 没有太多深入的经验,但 wmic 最近已被弃用(请参阅我的答案更新)。只要您的可启动 winpe 媒体包含 wmic,脚本就可以工作。虽然将来很可能更新的 winpe 创建工具将与此脚本一起更新。在这里我不会太担心,除非您在 .cmd 脚本中也完成了您的自定义部分,那么值得探索如何使用 powershell 来代替
猜你喜欢
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 2016-03-03
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多