如何自动忽略NSIS安装器字体安装错误并记录错误信息
解决NSIS字体安装错误弹窗并记录错误信息的方案
要实现忽略字体安装环节的错误弹窗但保留错误日志,我们可以通过NSIS的错误控制命令调整错误处理行为,同时捕获每个步骤的错误并输出到安装日志中。以下是具体的实现步骤和修改后的代码:
核心思路
- 临时关闭错误弹窗:在字体安装代码段开始前,保存当前的错误弹窗设置,然后禁用默认的错误提示框,避免失败时弹出干扰用户的窗口。
- 捕获每一步的错误:对字体复制、注册表写入、DLL调用等每个可能失败的操作,检查错误状态并通过
DetailPrint记录具体的错误信息。 - 恢复原有错误设置:字体安装完成后,恢复之前的错误弹窗配置,不影响安装器其他部分的错误处理。
修改后的完整代码
; 保存当前错误对话框的状态,后续恢复 GetErrorDialogs $R1 ; 关闭NSIS默认的错误弹窗 SetErrorDialogs off SetOverwrite ifnewer File ".\target\fonts\*.*" ; 检查文件复制是否出错 IfErrors 0 +2 DetailPrint "[Font Install Error] Failed to copy font files to target directory" ; 写入Arial Narrow字体注册表项并检查错误 WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" "Arial Narrow (TrueType)" "arialn.ttf" IfErrors 0 +2 DetailPrint "[Font Install Error] Failed to register 'Arial Narrow (TrueType)' in registry" WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" "Arial Narrow Bold (TrueType)" "arialnb.ttf" IfErrors 0 +2 DetailPrint "[Font Install Error] Failed to register 'Arial Narrow Bold (TrueType)' in registry" WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" "Arial Narrow Bold Italic (TrueType)" "arialnbi.ttf" IfErrors 0 +2 DetailPrint "[Font Install Error] Failed to register 'Arial Narrow Bold Italic (TrueType)' in registry" WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" "Arial Narrow Italic (TrueType)" "arialni.ttf" IfErrors 0 +2 DetailPrint "[Font Install Error] Failed to register 'Arial Narrow Italic (TrueType)' in registry" GetTempFileName $R0 File /oname=$R0 ".\target\additions\fonts.dll" ; 检查fonts.dll提取是否出错 IfErrors 0 +2 DetailPrint "[Font Install Error] Failed to extract fonts.dll to temporary location" ; 注册每个字体并检查错误 Push "arialn.ttf" CallInstDLL $R0 registerFont IfErrors 0 +2 DetailPrint "[Font Install Error] Failed to register font file: arialn.ttf" Push "arialnb.ttf" CallInstDLL $R0 registerFont IfErrors 0 +2 DetailPrint "[Font Install Error] Failed to register font file: arialnb.ttf" Push "arialnbi.ttf" CallInstDLL $R0 registerFont IfErrors 0 +2 DetailPrint "[Font Install Error] Failed to register font file: arialnbi.ttf" Push "arialni.ttf" CallInstDLL $R0 registerFont IfErrors 0 +2 DetailPrint "[Font Install Error] Failed to register font file: arialni.ttf" ; 恢复之前的错误对话框设置 SetErrorDialogs $R1 SetOverwrite on DetailPrint "Fonts installation process completed (errors logged above if any)"
代码说明
GetErrorDialogs $R1:保存当前的错误弹窗状态,确保后续能恢复到原有配置。SetErrorDialogs off:禁用NSIS内置的错误弹窗,这样即使操作失败也不会弹出提示框。IfErrors 0 +2:NSIS原生命令,检查上一步操作是否出错。如果没有错误(0),则跳过下一行(+2表示跳转到当前行之后的第二行);如果出错,则执行下一行的DetailPrint记录错误。- 每个操作后添加的
DetailPrint:会把具体的错误信息输出到安装日志中,你可以通过安装时的详细信息面板查看这些日志。
这样修改后,字体安装环节的错误不会再弹出干扰用户的窗口,但所有错误都会被记录下来,方便后续排查问题。
内容的提问来源于stack exchange,提问作者victorio
相关产品推荐
相关产品推荐

