报错原因是新版 Windows 已逐步移除或默认禁用 `wmic`,所以命令不存在
报错原因是新版 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' 不是内部或外部命令,也不是可运行的程序或批处理文件。
```
相关推荐
彻底移除Windows Defender
彻底移除Windows Defender,包含详细教程及工具,按照教程中顺序操作即可
win10彻底移除Windows-Defender
win10彻底移除Windows-Defender,最好用的工具,没有其他,只有唯一!Windows-Defende就是win10的自带杀毒。
DCOM 遇到错误“无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动
DCOM 遇到错误“无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动。
彻底移除Windows Defender全部组件
可以彻底移除Windows Defender全部组件,具体使用参考压缩包中的文档,按照步骤来使用,这个删除的操作不会影响系统更新,可放心使用!
禁用Windows7强制驱动数字签名
Windows7下对某些未经微软数字签名的驱动程序予以禁用,即使安装成功也无法使用,虽然可以按F8每次启动时禁止强制数字签名检测,但不免很麻烦。这个工具可以很好的解决这个问题,


