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