NSIS: определение версии и архитектуры Windows
Одна из частых задач при создании инсталлятора - определить версию и архитектуру ОС, например, чтобы в зависимости от этого подкладывать нужную версию экзешника, или устанавливать нужный драйвер.
Для отображения версии Windows можно воспользоваться готовым кодом из NSIS wiki. На выбор предоставлены два скрипта: только для клиентских ОС и для клиентских и серверных. Для своих целей я пользовался вторым, правда в нем есть небольшой баг - клиентская Windows XP x64 определяется как Windows Server 2003:

Создаем отдельный пустой NSIS-скрипт, копируем туда код из wiki, и сохраняем в тот же каталог, где находится основной скрипт инсталлятора под любым удобным названием, например
gvv.nsi.В основном скрипте подключаем этот файл:
!include gvv.nsiДалее вызываем
GetWindowsVersion, записываем результат в переменную (например, в предопределенную $R0) и выводим результат:${GetWindowsVersion} $R0
DetailPrint "Windows Version: $R0"Так сказать, "точное" определение версии. Применяется, когда надо выполнить определенные действия, например, в XP и только в XP, или в семерке и только в семерке.
Для этого в комплекте есть модуль
WinVer.nsh, сначала подключим его:!include WinVer.nshДалее используем
if и один из макросов IsWin?, например IsWinXP, IsWin7, IsWin10:${If} ${IsWinXP}
DetailPrint "Is Windows XP"
${EndIf}Применяется, когда нужно выполнять код, если версия ОС выше нужной или нужная.
В
WinVer.nsh есть другой комплект макросов - AtLeastWin? (AtLeastWin7, AtLeastWin8, AtLeastWin10) которые также нужно использовать вместе с if. Например, следующий код сработает на "семерке" и всех последующих версиях Windows. В деталях установки отобразится соответствующее сообщение:${If} ${AtLeastWin7}
DetailPrint "Is Windows 7 or higher"
${EndIf}Для определения архитектуры ОС необходимо подключить модуль
x64.nsh (также поставляется вместе с компилятором NSIS):!include x64.nshПоддерживается определение архитектуры x86 (
IsNativeIA32), PC (AMD) x64 (IsNativeAMD64) и ARM64 (IsNativeARM64) пример кода есть в самом файле x64.nsh :) Мне ARM была не нужна, поэтому пример кода на три строки короче:${If} ${IsNativeAMD64}
DetailPrint "System Architecture: x64"
${ElseIf} ${IsNativeIA32}
DetailPrint "System Architecture: x86"
${Else}
DetailPrint "Unsupported CPU architecture!"
${EndIf}
Windows XP x86

Windows XP x64

Windows 7 x86

Windows 7 x64

Windows 8.1 x86

Windows 8.1 x64
На GitHub
1. Get Windows version
2. Stackoverflow
Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/07/25/nsis-o