# 把 Windows 被控端打包成「多文件 EXE」(PyInstaller --onedir) # 用法: powershell -ExecutionPolicy Bypass -File windows\build_exe.ps1 # # 产物: dist_exe\ykxmz\ # ├─ ykxmz.exe <- 双击运行 # └─ _internal\ <- 依赖 # # 刻意使用 --onedir 而不是 --onefile: # * 启动不解压临时文件,秒开(双击就弹窗口) # * 依赖可见、可查杀、可替换,方便做安装包 # # 注意:本版本**不再使用系统托盘**(pystray 已移除), # 关窗后进程继续运行,靠单实例机制再次双击找回窗口。 $ErrorActionPreference = "Continue" $windows = $PSScriptRoot # LanRemote/windows $root = Split-Path -Parent $windows # LanRemote Write-Host "=== 1/3 生成图标 ===" -ForegroundColor Cyan & python (Join-Path $root "_build\make_ico.py") if ($LASTEXITCODE -ne 0) { throw "生成图标失败" } $ico = Join-Path $windows "app.ico" Write-Host "`n=== 2/3 PyInstaller 打包(--onedir 多文件)===" -ForegroundColor Cyan & python -m PyInstaller --noconfirm --clean --onedir --windowed ` --name "ykxmz" ` --icon "$ico" ` --paths "$windows" ` --hidden-import "PIL._tkinter_finder" ` --hidden-import "lanremote.netcheck" ` --hidden-import "lanremote.features" ` --hidden-import "lanremote.headless" ` --version-file (Join-Path $windows "version_info.txt") ` --noupx ` --exclude-module "pystray" ` --exclude-module "numpy" ` --exclude-module "psutil" ` --distpath (Join-Path $root "dist_exe") ` --workpath (Join-Path $root "_build\pyinstaller_work") ` --specpath (Join-Path $root "_build") ` (Join-Path $windows "run_agent.py") 2>&1 | Select-Object -Last 4 $target = Join-Path $root "dist_exe\ykxmz\ykxmz.exe" if (-not (Test-Path $target)) { throw "打包失败:未生成 $target" } Write-Host "`n=== 3/3 产物 ===" -ForegroundColor Cyan Write-Host "目录: $(Split-Path -Parent $target)" Write-Host ("exe : {0:N1} MB" -f ((Get-Item $target).Length / 1MB)) $all = Get-ChildItem (Split-Path -Parent $target) -Recurse -File Write-Host ("总计: {0} 个文件, {1:N1} MB" -f $all.Count, (($all | Measure-Object Length -Sum).Sum / 1MB)) Write-Host "`n完成" -ForegroundColor Green