Одна из частых задач при создании инсталлятора — определить версию и архитектуру ОС, например, чтобы в зависимости от этого подкладывать нужную версию экзешника, или устанавливать нужный драйвер.
Для отображения версии 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
1. Get Windows version
2. Stackoverflow