Repository: rime/weasel (language: cpp)

Issue:
安装程序无法正常进行静默安装
**上报前请检查**
- [X] 我遇到的问题没有其他人在 issue 里提到过
- [X] 我的小狼毫版本于 rime/weasel 下载
- [X] 我在使用小狼毫的最新发布版本，或最新发布版本后的 CI 构建

**操作系统信息**
 - OS 详细版本: 19045.3086
 - 小狼毫版本: 0.15.0.0

**描述遇到的问题**

下载最新版本的安装包后，在PowerShell内使用`.\weasel-0.15.0.0-installer.exe /S`执行静默安装时，安装程序会弹出本不应弹出的“方案選單設定”窗口，导致静默安装在这里卡住，无法正常完成安装并退出。

![image](https://github.com/rime/weasel/assets/56779163/7fdf1c3b-344c-4da9-8114-0300c82dbc9e)

安装程序的NSIS脚本在这一步试图使用`${GetParameters}`宏获取命令行参数以判断目前是否为静默安装，但是NSIS的静默安装参数`/S`会被NSIS系统本身所使用，不会出现在该宏返回的命令行参数中。

https://github.com/rime/weasel/blob/5824f8b8f3217d08a08e4b8348624e3901a5cac1/output/install.nsi#L210-L214

可以通过`IfSilent`函数检测当前是否为静默安装，例如：

https://github.com/rime/weasel/blob/5824f8b8f3217d08a08e4b8348624e3901a5cac1/output/install.nsi#L117-L120



Discussion / hints:
不是这个问题，上面列的那个是设置 weaselsetup 的参数，也确实起作用了。

第一次安装的时候用户文件夹中还没有方案，所以 weaseldeployer 会弹窗选择
嗯……好像确实。

那能否设置 weaseldeployer 在初次安装且为静默安装的情况下使用默认选项而无需用户选择？
PR Welcome

Fix patch:
diff --git a/output/install.nsi b/output/install.nsi
index a9cf80f7b..3ff59f57f 100644
--- a/output/install.nsi
+++ b/output/install.nsi
@@ -77,6 +77,7 @@ LangString LNKFORAPPFOLDER ${LANG_TRADCHINESE} "【小狼毫】程序文件夾"
 LangString LNKFORUPDATER ${LANG_TRADCHINESE} "【小狼毫】檢查新版本"
 LangString LNKFORSETUP ${LANG_TRADCHINESE} "【小狼毫】安裝選項"
 LangString LNKFORUNINSTALL ${LANG_TRADCHINESE} "卸載小狼毫"
+LangString CONFIRMATION ${LANG_TRADCHINESE} "安裝前，我打盤先卸載舊版本的小狼毫。$\n$\n按下「確定」移除舊版本，按下「取消」放棄本次安裝。"
 
 !insertmacro MUI_LANGUAGE "SimpChinese"
 LangString DISPLAYNAME ${LANG_SIMPCHINESE} "小狼毫输入法"
@@ -91,20 +92,23 @@ LangString LNKFORAPPFOLDER ${LANG_SIMPCHINESE} "【小狼毫】程序文件夹"
 LangString LNKFORUPDATER ${LANG_SIMPCHINESE} "【小狼毫】检查新版本"
 LangString LNKFORSETUP ${LANG_SIMPCHINESE} "【小狼毫】安装选项"
 LangString LNKFORUNINSTALL ${LANG_SIMPCHINESE} "卸载小狼毫"
+LangString CONFIRMATION ${LANG_SIMPCHINESE} '安装前，请先卸载旧版本的小狼毫。$\n$\n点击 "确定" 移除旧版本，或点击 "取消" 放弃本次安装。'
 
 !insertmacro MUI_LANGUAGE "English"
 LangString DISPLAYNAME ${LANG_ENGLISH} "Weasel"
-LangString LNKFORMANUAL ${LANG_ENGLISH} "[Weasel] Manual"
-LangString LNKFORSETTING ${LANG_ENGLISH} "[Weasel] Settings"
-LangString LNKFORDICT ${LANG_ENGLISH} "[Weasel] Dictionary Manager"
-LangString LNKFORSYNC ${LANG_ENGLISH} "[Weasel] Sync User Profile"
-LangString LNKFORDEPLOY ${LANG_ENGLISH} "[Weasel] Deploy"
+LangString LNKFORMANUAL ${LANG_ENGLISH} "Weasel Manual"
+LangString LNKFORSETTING ${LANG_ENGLISH} "Weasel Settings"
+LangString LNKFORDICT ${LANG_ENGLISH} "Weasel Dictionary Manager"
+LangString LNKFORSYNC ${LANG_ENGLISH} "Weasel Sync User Profile"
+LangString LNKFORDEPLOY ${LANG_ENGLISH} "Weasel Deploy"
 LangString LNKFORSERVER ${LANG_ENGLISH} "Weasel Server"
-LangString LNKFORUSERFOLDER ${LANG_ENGLISH} "[Weasel] User Folder"
-LangString LNKFORAPPFOLDER ${LANG_ENGLISH} "[Weasel] App Folder"
-LangString LNKFORUPDATER ${LANG_ENGLISH} "[Weasel] Check for Updates"
-LangString LNKFORSETUP ${LANG_ENGLISH} "[Weasel] Installation Preference"
+LangString LNKFORUSERFOLDER ${LANG_ENGLISH} "Weasel User Folder"
+LangString LNKFORAPPFOLDER ${LANG_ENGLISH} "Weasel App Folder"
+LangString LNKFORUPDATER ${LANG_ENGLISH} "Weasel Check for Updates"
+LangString LNKFORSETUP ${LANG_ENGLISH} "Weasel Installation Preference"
 LangString LNKFORUNINSTALL ${LANG_ENGLISH} "Uninstall Weasel"
+LangString CONFIRMATION ${LANG_ENGLISH} "Before installation, please uninstall the old version of Weasel.$\n$\nPress 'OK' to remove the old version, or 'Cancel' to abort installation."
+
 ;--------------------------------
 
 Function .onInit
@@ -115,9 +119,7 @@ Function .onInit
 
   StrCpy $0 "Upgrade"
   IfSilent uninst 0
-  MessageBox MB_OKCANCEL|MB_ICONINFORMATION \
-  "安裝前，我打盤先卸載舊版本的小狼毫。$\n$\n按下「確定」移除舊版本，按下「取消」放棄本次安裝。" \
-  IDOK uninst
+  MessageBox MB_OKCANCEL|MB_ICONINFORMATION "$(CONFIRMATION)" IDOK uninst
   Abort
 
 uninst:
@@ -208,7 +210,7 @@ program_files:
   SetOutPath $INSTDIR
 
   ; test /T flag for zh_TW locale
-  StrCpy $R2  "/i"
+  StrCpy $R2 "/i"
   ${GetParameters} $R0
   ClearErrors
   ${GetOptions} $R0 "/S" $R1
@@ -232,7 +234,13 @@ program_files:
   WriteUninstaller "$INSTDIR\uninstall.exe"
 
   ; run as user...
-  ExecWait "$INSTDIR\WeaselDeployer.exe /install"
+  IfSilent +2
+    ExecWait "$INSTDIR\WeaselDeployer.exe /install"
+    Goto deploy_done
+
+  ExecWait "$INSTDIR\WeaselDeployer.exe /deploy"
+  deploy_done:
+  ; ...
 
   ; Write autorun key
   WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Run" "WeaselServer" "$INSTDIR\WeaselServer.exe"


Test patch: