# -*- coding: utf-8 -*- """把用户的安装目录也改成 ykxmz。 要做的: 1. 停掉正在跑的旧进程 2. C:\\Users\\shu\\Desktop\\LanRemote-Agent -> C:\\Users\\shu\\Desktop\\ykxmz 3. 部署新的 ykxmz.exe 4. 把开机自启项改指向新路径(旧名 LanRemoteAgent 也清掉) 5. 清掉旧的 dist_exe\\LanRemote-Agent 构建目录 配对码和数据目录跟着走,不丢。 """ from __future__ import annotations import shutil import subprocess import sys from pathlib import Path ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote") DESKTOP = Path(r"C:\Users\shu\Desktop") BUILT = ROOT / "dist_exe" / "ykxmz" RUN_KEY = r"HKCU\Software\Microsoft\Windows\CurrentVersion\Run" MOVES = [ (DESKTOP / "LanRemote-Agent", DESKTOP / "ykxmz"), (DESKTOP / "deepseekagent" / "LanRemote-Agent", DESKTOP / "deepseekagent" / "ykxmz"), ] def stop_running() -> None: for image in ("LanRemote-Agent.exe", "ykxmz.exe"): subprocess.run(["taskkill", "/F", "/IM", image], capture_output=True) print(" 已停掉旧进程") def move_dir(src: Path, dst: Path) -> str: if not src.is_dir(): return f" {src.name}: 不存在,跳过" if dst.exists(): # 新目录已经在了:只把 data 搬过去(那里有配对码) old_data = src / "data" if old_data.is_dir(): shutil.copytree(old_data, dst / "data", dirs_exist_ok=True) return f" {src.name}: 新目录已存在,把 data 合并过去了" return f" {src.name}: 新目录已存在,跳过" src.rename(dst) return f" {src.name} -> {dst.name}" def deploy(dst: Path) -> str: if not dst.is_dir(): return f" {dst.name}: 不存在,跳过" # 清掉旧 exe,再拷新的 for stale in ("LanRemote-Agent.exe", "LanRemote-Agent.old"): target = dst / stale if target.exists(): target.unlink(missing_ok=True) subprocess.run( ["robocopy", str(BUILT), str(dst), "/E", "/XD", "data", "received", "/NFL", "/NDL", "/NJH", "/NJS", "/NP"], capture_output=True) exe = dst / "ykxmz.exe" return (f" {dst.name}: 部署完成,{'有' if exe.is_file() else '缺'} ykxmz.exe") def fix_autostart(dst: Path) -> str: """把自启项指向新的 exe,并清掉旧名。""" # 先删旧名 for name in ("LanRemoteAgent",): subprocess.run(["reg", "delete", RUN_KEY, "/v", name, "/f"], capture_output=True) exe = dst / "ykxmz.exe" if not exe.is_file(): return " 没有新 exe,自启项未改" subprocess.run(["reg", "delete", RUN_KEY, "/v", "ykxmz", "/f"], capture_output=True) proc = subprocess.run( ["reg", "add", RUN_KEY, "/v", "ykxmz", "/t", "REG_SZ", "/d", f'"{exe}" --silent', "/f"], capture_output=True) if proc.returncode == 0: return f' 自启项 ykxmz -> "{exe}" --silent' return " 写自启项失败" def main() -> int: print("一、停进程") stop_running() print() print("二、迁移安装目录") moved = [] for src, dst in MOVES: print(move_dir(src, dst)) moved.append(dst) print() print("三、部署新 exe") for dst in moved: if dst.parent == DESKTOP: # 只部署到桌面那个(用户实际用的) print(deploy(dst)) print() print("四、改开机自启") user_dir = DESKTOP / "ykxmz" print(fix_autostart(user_dir)) print() print("五、清掉旧构建目录") old_build = ROOT / "dist_exe" / "LanRemote-Agent" if old_build.is_dir(): shutil.rmtree(old_build, ignore_errors=True) print(f" 删掉 {old_build.name}") else: print(" 旧构建目录已经不在了") print() print("六、复核") proc = subprocess.run(["reg", "query", RUN_KEY], capture_output=True, text=True, encoding="mbcs", errors="replace") for line in (proc.stdout or "").splitlines(): if "ykxmz" in line or "LanRemote" in line: print(" " + line.strip()) exe = user_dir / "ykxmz.exe" print(f" {exe} {'存在' if exe.is_file() else '不存在'}") data = user_dir / "data" print(f" {data} {'存在(配对码在里面)' if data.is_dir() else '不存在'}") return 0 if __name__ == "__main__": sys.exit(main())