diff --git a/bat/Initialization.bat b/bat/Initialization.bat new file mode 100644 index 0000000..4895739 --- /dev/null +++ b/bat/Initialization.bat @@ -0,0 +1,151 @@ +@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% + +:: 接下来读取这个目录下的所有文件,挨个处理 +for /f "delims=" %%F in ('dir /a-d /b "%configpath%\*" 2^>nul') do ( + echo 为文件 "%configpath%\%%F" 创建软连接 + call :link %%F +) +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 \ No newline at end of file