雷电模拟器数据备份

news/2024/10/23 9:26:10/
import subprocess
import glob
import time
import os
import shutil
from pathlib import Path# (要改1)模拟器文件共享路径
BACKUP_DIR = r"C:\Users\Administrator\Documents\XuanZhi64\Pictures"
# (要改2)模拟器安装路径
LD_DIR = r"D:\LDPlayer\LDPlayer64"VMS_CONFIG_DIR = LD_DIR + r"\vms\config"
BACKUP_CMD = "cd /data && tar -zhpcf /sdcard/Pictures/{}_data.tar.gz . --exclude=local --exclude=app " \"--exclude=user_de/0/com.google.android.tts --exclude=dalvik-cache --exclude=tombstones " \"--exclude=system_de/0/ringtones --exclude=misc --exclude=app-lib --exclude=media --exclude=ota " \"--exclude=property --exclude=adb --exclude=anr --exclude=app-asec;exit\n "
ROLLBACK_CMD = "cd /data && tar -zxf /sdcard/Pictures/{}_data.tar.gz;exit\n"# PULL_FILE_TEMPLATE = 'ldconsole.exe adb --index {} --command "pull /sdcard/data.tar.gz {}"'
# PUSH_FILE_TEMPLATE = 'ldconsole.exe adb --index {} --command "push {} /sdcard/data.tar.gz"'# def ensure_dir(p):
#     b = Path(p)
#     if not b.exists():
#         b.mkdir()
#     return bos.chdir(LD_DIR)
# ensure_dir(BACKUP_DIR)
ba = glob.glob(f"{VMS_CONFIG_DIR}\\leidian[0-9]*.config")
ld_count = len(ba)def backup(dst_ld_index, is_rollback=False, rollback_from_other_index=None):rollback_index = dst_ld_indexif is_rollback and isinstance(rollback_from_other_index, int):rollback_index = rollback_from_other_indexbackup_config_path = f"{BACKUP_DIR}/{rollback_index}.config"backup_datagz_path = f"{BACKUP_DIR}/{rollback_index}_data.tar.gz"if is_rollback:if not Path(backup_config_path).exists() or not Path(backup_datagz_path).exists():print("恢复到模拟器失败,先备份再进行还原")return -2p = subprocess.Popen(f"ld -s {dst_ld_index}", shell=True, universal_newlines=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)time.sleep(1)# not found emulatorif isinstance(p.poll(), int) and p.poll() > 0:return p.poll()if p.poll() is None:# BACKUP_CMD = "echo 11 && exit\n"if not is_rollback:p.stdin.write(BACKUP_CMD.format(dst_ld_index))else:p.stdin.write(ROLLBACK_CMD.format(rollback_index))p.stdin.flush()wait_count = 0start = time.time()while p.poll() is None:wait_count += 1time.sleep(1)if wait_count > 3:print("备份超时 > {}s".format(wait_count))breakend = time.time()print("备份完成,耗时{}秒".format(int(end - start)))if not is_rollback:shutil.copyfile(f"{VMS_CONFIG_DIR}/leidian{dst_ld_index}.config", backup_config_path)else:for i in range(5):time.sleep(10)test(dst_ld_index, rollback_index)# if p.poll() == 0:# copy file# pull_cmd = PULL_FILE_TEMPLATE.format(ld_index, f"{BACKUP_DIR}/{ld_index}.tar.gz")# ret_code = subprocess.check_call(pull_cmd, shell=True, stderr=subprocess.PIPE)return p.poll()return -1def test(dst_ld_index,rollback_index):# dst_ld_index = 12# rollback_index = 2subprocess.check_call(f"ldconsole.exe quit --index {dst_ld_index}", shell=True, stderr=subprocess.PIPE)time.sleep(10)backup_config_path = f"{BACKUP_DIR}/{rollback_index}.config"shutil.copyfile(backup_config_path, f"{VMS_CONFIG_DIR}/leidian{dst_ld_index}.config")subprocess.check_call(f"ldconsole.exe launch --index {dst_ld_index}", shell=True,stderr=subprocess.PIPE)print(dst_ld_index, rollback_index)def shell_mode():tips = f"""雷电模拟器数据备份工具 1.0 ### (当前扫描到{ld_count}个模拟器){", ".join([str(i) for i in range(ld_count)])}使用方法:1. 输入b11   备份11号模拟器2. 输入h11   从11号模拟器数据还原到11号模拟器数据3. 输入h11-2 从 2号模拟器数据还原到11号模拟器数据4. 输入ba    备份所有模拟器5. 输出ha    还原所有模拟器"""print(tips)while True:cmd = input("\n>> 输入下一步操作指令\n")ret = -16if cmd == "ba":print("开始备份所有模拟器")for i in range(ld_count):ret = backup(i)print(f"备份模拟器{i},返回码:{ret} (0是正常)")continueelif cmd == "ha":print("开始还原所有模拟器")for i in range(ld_count):ret = backup(i, is_rollback=True)print(f"还原模拟器{i},返回码:{ret} (0是正常)")continueelif "h" in cmd and "-" in cmd:ld_index = int(cmd.split("-")[0][1:])rollback_from_index = int(cmd.split("-")[1])print(f"还原模拟器{ld_index}, 数据来源:{rollback_from_index}")ret = backup(ld_index, True, rollback_from_index)elif "h" in cmd:ld_index = int(cmd[1:])print(f"还原模拟器{ld_index}")ret = backup(ld_index, True)elif "b" in cmd:ld_index = int(cmd[1:])print(f"备份模拟器{ld_index}")ret = backup(ld_index)else:print("执行代码指令:" + cmd)eval(cmd)continueprint(f"执行完成, 返回码:{ret} (0是正常)")if __name__ == "__main__":shell_mode()

http://www.ppmy.cn/news/916678.html

相关文章

Centos7 模拟XFS文件系统的备份和恢复

前言: XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据。xfsdump 按inode顺序备份一个XFS文件系统。 centos7选择xfs格式作为默认文件系统,而且不再使用以前的ext,仍然支持ext4,xfs专为大数据产生,每…

【NAS】整机备份还原Windows/Linux系统,群晖最强套件ABB教程

群晖最强套件ABB(Active Backup for Business) 这个套件可以实现 Windows整机备份,但比ghots技术更强 操作简单,堪比苹果上的Time Machine,一样的实时备份,增量备份,只要安装软件并开机自启就能实现&#…

FT2000+下使用Clonezilla进行系统备份还原

说明: 此备份功能用于备份目标电脑中的OS(包含客户的应用程序、环境等)当目标电脑的系统(当开启overlay/备份还原分区功能时,此处的“系统”指的是“基础系统”)被损坏,可用保存的镜像快速恢复…

DSM7下套件迁移

目录 一、介绍二、测试平台三、原理四、使用说明 一、介绍 用于在Synology DSM7 中将套件迁移到不同的存储空间。 二、测试平台 所有功能在DS3615xs DSM 7.1.1-42962 Update 2中测试通过。 经测试的套件 官方套件 套件目录名套件名称迁移结果备注CloudSyncCloud Sync正常…

模拟人生mod后缀php,【搬运】模拟人生4家具MOD第一弹

╱人◕‿‿◕人╲定下契约 x 本帖最后由 VassaNine 于 2014-11-20 10:17 编辑 搬运自其它论坛or网站的家具MOD资源。 感谢大大们的创作&搬运~ MOD安装方法: 1.解压缩 2.将解压后的*.package文件放入游戏运行后生成的Mods文件夹目录 (根据游戏版本不同&#xff0…

FPGA 中 IP基础学习

IP 是什么? 首先,要知道什么是IP。Intellecture Property,相当于软件领域的API函数库,三方开源项目。要开发一个真正可用的电路设计,不管什么领域,总会使用到一些IP,不太可能从头开始。IP分为硬…

Hydra(九头蛇)密码破解工具的详细使用教程

简介 Hydra是⼀款开源的暴⼒密码pojie⼯具,⽀持多种协议密码的破译。 可以对多种服务的账号和密码进行爆破,包括 数据库、SSH、FTP 等服务,在 Kali Linux 中自带 Hydra。有了这个工具就可以很方便的对密码进行破解。 其简单的使用参数如下&a…

飞行动力学 - 第10节-空间机动性、稳定性与操纵性概述 之 基础点摘要

飞行动力学 - 第10节-空间机动性、稳定性与操纵性概述 之 基础点摘要 1. 协调盘旋性能计算流程2. 一般盘旋2.1 动力学方程2.2 角点速度2.3 典型战斗机盘旋曲线 3. 空间机动能力4. 飞行动力学:飞行性能稳定性与操纵性5. 稳定性定义6. 飞行品质6.1 品质等级6.2 品质评…