python批量执行系统命令

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"))

再次使用虚拟机克隆功能,克隆成功!

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值