报错原因是新版 Windows 已逐步移除或默认禁用 `wmic`,所以命令不存在

Bol5261 CSDN会员 Bol5261 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

报错原因是新版 Windows 已逐步移除或默认禁用 `wmic`,所以命令不存在。建议改用 PowerShell 的 CIM 命令获取硬盘序列号,同时去掉会导致 CPU 满载的 `while True`。

```python
import json
import subprocess


def get_disk_serial_numbers():
    """获取 Windows 物理硬盘序列号。"""
    command = [
        "powershell.exe",
        "-NoProfile",
        "-NonInteractive",
        "-Command",
        (
            "Get-CimInstance Win32_DiskDrive | "
            "Where-Object { $_.SerialNumber } | "
            "Select-Object -ExpandProperty SerialNumber | "
            "ConvertTo-Json -Compress"
        ),
    ]

    try:
        result = subprocess.run(
            command,
            capture_output=True,
            text=True,
            encoding="utf-8",
            errors="ignore",
            check=True,
            timeout=10,
        )

        output = result.stdout.strip()
        if not output:
            return []

        data = json.loads(output)

        # 只有一个序列号时,PowerShell 输出的是字符串而非数组
        if isinstance(data, str):
            data = [data]

        return [str(item).strip() for item in data if str(item).strip()]

    except (
        subprocess.CalledProcessError,
        subprocess.TimeoutExpired,
        FileNotFoundError,
        json.JSONDecodeError,
    ) as exc:
        print(f"读取硬盘序列号失败:{exc}")
        return []


def _run():
    actual_serials = get_disk_serial_numbers()
    expected_serials = ["Z85ZTU8MS", "WD-WXA2DA164EPY"]

    print("检测到的硬盘序列号:", actual_serials)

    # 如果硬盘返回顺序可能变化,使用集合比较
    if set(actual_serials) == set(expected_serials):
        print("硬盘序列号验证通过")
        return True

    print("硬盘序列号验证失败")
    return False


if __name__ == "__main__":
    _run()
```

### 关键修改

1. 用以下 PowerShell 命令代替已弃用的 `wmic`:

   ```powershell
   Get-CimInstance Win32_DiskDrive
   ```

2. 不要比较列表的字符串表示:

   ```python
   str(path_disk_dk1) == str(path_disk_dk2)
   ```

   应直接比较列表或集合:

   ```python
   set(actual_serials) == set(expected_serials)
   ```

3. 原来的无限循环应删除:

   ```python
   while True:
       if 条件:
           break
       else:
           continue
   ```

   当序列号不一致时,这段代码会永久空转,使 CPU 占用升高,并不会重新读取硬盘序列号。

如果只要求“指定的两个硬盘均存在”,但允许电脑中还有其他硬盘,可以改成:

```python
if set(expected_serials).issubset(set(actual_serials)):
    print("指定硬盘均存在")
```

另外,你看到的:

```text
'wmic' �����ڲ����ⲿ���...
```

是控制台编码不一致造成的乱码,其实际含义通常是:

```text
'wmic' 不是内部或外部命令,也不是可运行的程序或批处理文件。
```

...全文

相关推荐

评论
收藏 已收藏
分享
返回顶部
Bol5261 CSDN会员
Bol5261 新星创作者: Java技术领域 新星创作者: Java技术领域优质创作者: 学术研究与理论基础技术领域 优质创作者: 学术研究与理论基础技术领域
Borter 9 成员 1,344 内容