python批量执行系统命令
今天克隆虚拟机时出了一点问题,报错如下:
VMware错误:指定的虚拟磁盘需要进行修复
网上查了一下解决办法,大体是使用vmware的一个工具执行命令
"C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager.exe" -R "虚拟磁盘路径"
这里的虚拟磁盘路径是指需要克隆的虚拟机的虚拟磁盘路径,就是vmdk文件
例如:
命令行先切换到C:\Program Files (x86)\VMware\VMware Workstation\ 目录下,然后执行命令
vmware-vdiskmanager.exe" -R "F:\vm\win11\Windows 11.vmdk"
我打开我的克隆主机目录一看,不得了,有126个vmdk文件,就是说,这行命令那我得敲上126次,还要写对文件名,那还得了!
于是就想用python写个脚本完成
思路:首先,要获取目录的所有文件名;获取后,需要遍历数组,获取文件名后缀为vmdk的文件,然后依次执行命令
1 获取目录的所有文件名
使用os.listdir命令,以下命令可以获取当前目录的所有文件名
file_names = [f for f in os.listdir('.') if os.path.isfile(f)]
print(file_names)
2 获取文件名后缀
使用 os.path 模块获取文件扩展名是更安全的方法,它可以正确处理包含多个点号的文件名,同时还能处理一些特殊情况,比如文件名中包含特殊字符或目录名。
filename = "example.docx"
ext=os.path.splitext(filename)[-1]
print(ext)
3 执行命令
执行命令有很多种方式,常用的是os.system(),但这种方式输出中文时会乱码
subprocess可以指定编码格式来输出中文
# 执行命令ipconfig -all
result = subprocess.run(["ipconfig", "/all"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
# 输出执行结果
print(result.stdout.decode("gbk"))
其中,subprocess.run函数的参数含义如下:
- args:要执行的命令及参数,可以是列表或字符串,字串需加上shell=True;
- stdout:子进程的输出将被重定向到此参数指定的 PIPE;
- stderr:子进程的错误输出将被重定向到此参数指定的 PIPE;
- shell:是否通过新的 shell 来运行程序;
在以上示例中,通过shell=True,表示在新的 shell/cmd 中执行命令,并最终将执行结果存储在result.stdout中。需要注意的是,此时获取到的输出是bytes类型,需要通过.decode()方法将其转换为str类型,以方便我们在Python程序中进行处理。
由于我们执行的命令是:
"C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager.exe" -R "虚拟磁盘路径"
斜杠会被认为是转义字符,所以要写两个斜杠
脚本全文如下:
import os, subprocess
file_names = os.listdir('F:/vm/win11') # 获取目录所有文件名
for f in file_names:
# 获取文件后缀名并匹配vmdk文件
if os.path.splitext(f)[-1] == ".vmdk":
print(f)
# 执行命令
result = subprocess.run(["C:\\Program Files (x86)\\VMware\\VMware Workstation\\vmware-vdiskmanager.exe", "-R", f"F:\\vm\\win11\\{f}"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
# 输出执行结果
print(result.stdout.decode("gbk"))
再次使用虚拟机克隆功能,克隆成功!