c# - 如何在 NSIS 中检测 Windows 7
问题描述
现在我们正在使用windows窗体。NSIS 用于 Windows 窗体安装。但我需要阻止在 Windows 7 操作系统中的安装如何做到这一点?我正在使用下面的代码。
; Script generated by the HM NIS Edit Script Wizard.
; HM NIS Edit Wizard helper defines
!define PRODUCT_TYPE "Home" ; Home/Clinic ------
!define CONFIG_TYPE "Prod" ; Release/Local/Devl/Devl_Test/Demo/Test/Prod ------
!define PRODUCT_NAME "nQ Medical ${PRODUCT_TYPE} Keyboard"
!define PRODUCT_VERSION "1.2.0"
!define PRODUCT_PUBLISHER "nQ Medical Inc."
!define PRODUCT_WEB_SITE "https://platform.nq-medical.com"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${APP_NAME}"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define APP_NAME "nQKeyboard.exe"
; MUI 1.67 compatible ------
!include "MUI.nsh"
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "nQKeyboard\iconNQ.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
RequestExecutionLevel admin
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "nQKeyboard\bin\${CONFIG_TYPE}\EULA.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\${APP_NAME}"
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "English"
; MUI end ------
Name "${PRODUCT_NAME}"
;Currently deploys the installer file to a 'Published' sub-directory in the 'Solution' directory
OutFile "Published\nQ Medical ${PRODUCT_TYPE} Keyboard.exe"
InstallDir "$PROGRAMFILES\nQ Medical Keyboard"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show
Section "MainSection" SEC01
; Kill the running application
ExecWait "TaskKill /IM ${APP_NAME} /F"
SetOutPath "$INSTDIR"
SetOverwrite try
File "nQKeyboard\bin\${CONFIG_TYPE}\iconNQ.ico"
File "nQKeyboard\bin\${CONFIG_TYPE}\Newtonsoft.Json.dll"
File "nQKeyboard\bin\${CONFIG_TYPE}\RestSharp.dll"
File "nQKeyboard\bin\${CONFIG_TYPE}\RestSharp.Serializers.NewtonsoftJson.dll"
File "nQKeyboard\bin\${CONFIG_TYPE}\GraphQL.Client.dll"
File "nQKeyboard\bin\${CONFIG_TYPE}\GraphQL.Common.dll"
File "nQKeyboard\bin\${CONFIG_TYPE}\EULA.txt"
File "nQKeyboard\bin\${CONFIG_TYPE}\${APP_NAME}"
CreateDirectory "$SMPROGRAMS\nQ Medical Keyboard"
CreateShortCut "$SMPROGRAMS\nQ Medical Keyboard\nQ Medical Keyboard.lnk" "$INSTDIR\${APP_NAME}"
CreateShortCut "$DESKTOP\nQ Medical Keyboard.lnk" "$INSTDIR\${APP_NAME}"
File "nQKeyboard\bin\${CONFIG_TYPE}\${APP_NAME}.config"
SectionEnd.
那么如何添加代码部分?IE; 如果 Windows 7 是操作系统,则不会进行安装。执行脚本时显示错误消息。怎么做?
解决方案
NSIS 提供了 WinVer.nsh 头文件,可帮助您检测各种 Windows 版本。
版本检测一开始可能看起来很简单,但很容易出错,而且您的问题并没有真正提供足够的信息来写出明确的答案!
你的问题的天真答案是
!include WinVer.nsh
Function .onInit
${If} ${IsWin7}
MessageBox MB_ICONSTOP "Windows version blah blah!"
SetErrorLevel 1150 ; ERROR_OLD_WIN_VERSION
Quit
${EndIf}
FunctionEnd
起初这似乎很好,但假设有一些技术原因导致您的应用程序无法在 Windows 7 上运行,那么您可能还需要阻止 Server 2008 R2,因为它与 Windows 的版本基本相同:
${If} ${IsWin7}
${OrIf} ${IsWin2008R2}
...
大多数时候你有一些你支持的最低版本的 Windows,你真的应该阻止任何旧版本。最好的方法是确保您使用的是您支持的版本:
!include WinVer.nsh
Function .onInit
${IfNot} ${AtLeastWin8}
MessageBox MB_ICONSTOP "Windows version blah blah!"
SetErrorLevel 1150 ; ERROR_OLD_WIN_VERSION
Quit
${EndIf}
FunctionEnd
如果您真的熟悉各种 Windows 内部版本号,您也可以直接检查:
${IfNot} ${AtLeastBuild} 9200
...
推荐阅读
- azure-devops - 默认取消选择阶段
- excel - 如何建立 VBA 宏以将范围而不是单个单元格复制并粘贴到 MS Word 文档中?
- polygon - 使用 glPolygonMode OpenGL 命令的兴趣
- python - 如何在 pudb(Python 调试器)上选择或更改主题?
- javascript - 如何在 ThumbnailsCard 中使用“点击”
- javascript - 缩位检查功能
- python - 如何让 pipenv 安装包子依赖项
- c# - 如何使用 websockets 在我的 Azure 应用服务 Web 应用和本地控制台应用之间建立连接?
- python - 根据 pivot_table 的输出动态重命名数据框
- amazon-web-services - 有条件地设置带有 IF 的标签在 cloudformation 模板中不起作用