@echo off setlocal ::获取输入程序所在目录(通过注册表中的卸载路径) :: 注册表路径 set "regKeOFUninstall=HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Weasel" :: 读取 UninstallString 值 for /f "tokens=2*" %%a in ('reg query "%regKeOFUninstall%" /v "UninstallString" 2^>nul ^| findstr /i "UninstallString"') do ( set "uninstallCmd=%%b" ) :: 检查是否找到 if not defined uninstallCmd ( echo 错误:未找到小狼毫(Weasel)的注册表项。 pause exit /b 1 ) ::得到卸载程序目录 echo %uninstallCmd% :: 去掉开头和结尾的引号,得到的目录,首尾有双引号,需要去掉 call set "clean=%%uninstallCmd:"=%%" :: 提取所在的路径,也就是安装目录 for %%I in ("%clean%") do set "apppath=%%~dpI" echo 输入法程序安装在%apppath%WeaselDeployer.exe :: 找到用户文件夹路径,通过注册表中的路径 set "regKeyOfUserDIR=HKCU\SOFTWARE\Rime\Weasel" :: 读取 RimeUserDir 的值 for /f "tokens=2*" %%a in ('reg query "%regKeyOfUserDIR%" /v "RimeUserDir" 2^>nul ^| findstr /i "RimeUserDir"') do ( set "rimeUserDir=%%b" ) :: 检查是否成功读取 if not defined rimeUserDir ( echo 错误:未找到 RimeUserDir 注册表项。 pause exit /b 1 ) echo 注册表读取的Rime用户目录: %rimeUserDir% :: 去掉开头和结尾的引号,得到的目录,首尾有双引号,需要去掉,去掉后得到的就是用户目录 call set "userpath=%%rimeUserDir:"=%%" echo 获得的用户目录是:%userpath% :: 获取当前批处理文件所在目录(结尾带反斜杠) set "CURRENT_DIR=%~dp0" :: 构建 autosync.bat 的完整路径,为了后续添加定时任务 set "TARGET_SCRIPT=%CURRENT_DIR%autosync.bat" set "TARGET_VBS=%CURRENT_DIR%run_hidden.vbs" set "CMD=wscript.exe //nologo \"%CURRENT_DIR%run_hidden.vbs\" \"%CURRENT_DIR%autosync.bat\"" :: 去掉末尾的反斜杠(便于处理) if "%CURRENT_DIR:~-1%"=="\" set "CURRENT_DIR=%CURRENT_DIR:~0,-1%" :: 获取上层目录(父目录) for %%I in ("%CURRENT_DIR%") do set "PARENT_DIR=%%~dpI" :: 拼接config set "configpath=%PARENT_DIR%config" echo 获得的配置文件目录是:%configpath% call :link "custom_phrase.txt" call :link "default.custom.yaml" call :link "weasel.custom.yaml" call :link "weasel.yaml" call :link "default.yaml" pause echo 接下来重新部署输入法 if exist "%apppath%\WeaselDeployer.exe" ( "%apppath%WeaselDeployer.exe" /deploy echo 部署功能应该已经启动,确定后按任意键退出. pause ) else ( echo 没有找到可执行程序,请检查目录后重试 pause exit /b 1 ) :: 接下来设置定时任务 echo 目标bat文件路径%TARGET_SCRIPT% :: 检查 autosync.bat 是否存在 if not exist "%TARGET_SCRIPT%" ( echo 错误:未找到 %TARGET_SCRIPT% pause exit /b 1 ) echo 目标vbs文件路径%TARGET_VBS% :: 检查 autosync.bat 是否存在 if not exist "%TARGET_VBS%" ( echo 错误:未找到 %TARGET_VBS% pause exit /b 1 ) :: 转义路径中的空格和特殊字符(用双引号包裹,并在 schtasks 中用 \" 转义) set "QUOTED_SCRIPT=\"%TARGET_SCRIPT%\"" :: 任务名称 set "TASK_NAME=RimeAutoSync" :: 创建每10分钟运行一次的任务(从现在开始,每天重复) schtasks /create ^ /tn "%TASK_NAME%" ^ /tr "%CMD%" ^ /sc minute ^ /mo 10 ^ /f if %errorlevel% equ 0 ( echo. echo 定时任务创建成功! echo - 任务名称: %TASK_NAME% echo - 执行频率: 每 10 分钟检查一次 echo - 实际同步条件: 系统空闲 ≥30 分钟 echo - 脚本路径: %CMD% echo. echo 注意:请确保 autosync.bat 与本脚本在同一目录。 ) else ( echo 创建失败。建议以管理员身份运行(非必须,但可避免权限问题)。 ) echo 任务创建成功,按任意键退出. pause goto :eof :: ================= 函数定义(用来创建文件软连接) ================= :link set "filename=%~1" ::设置软连链接 echo 开始处理%filename% set "TARGET=%configpath%\%filename%" set "LINK=%userpath%\%filename%" echo 目标文件是:%TARGET% echo 软连接文件是:%LINK% if exist "%TARGET%" ( echo 找到配置文件了%TARGET% ) else ( echo 配置目录下没有%filename%文件,请检查 pause exit /b 1 ) if exist "%LINK%" ( echo 文件 %LINK% 已经存在,创建软连接前会删除文件,请确保该文件已经备份,然后按回车键继续,否则,请关闭后备份。 set /p "dummy=" del "%LINK%" ) else ( echo 文件 %LINK% 不存在! ) :: 前面如果用户已经按了回车,说明同意删除原来的文件,现在就可以创建文件软链接了 mklink "%LINK%" "%TARGET%" goto :eof