2013-01-19 196 views
5

在NSIS中有一種方法可以確定用戶當前正在運行的Windows版本是什麼?NSIS檢測Windows版本

我想這樣做的原因是因爲我的安裝程序在Windows XP計算機上看起來不同。我的安裝程序使用MUI2,但我似乎沒有像在Windows 7中那樣具有相同的GUI按鈕(我認爲其稱爲XP樣式),主安裝程序窗口比Windows 7(其中大約500 x 400像素)大得多。 在使用MUI2的安裝程序中有這些差異是否正常?我認爲MUI2在Windows XP和Windows XP中使外觀保持一致?

爲了克服在安裝程序窗口大小的差別,我的解決方法是檢測,如果用戶使用的是Windows XP,並相應地調整窗口的大小。這可能嗎?

我需要有一個靠窗的具體大小,因爲我有一個背景圖像和圖像是500像素寬,所以如果安裝程序窗口是大我有一個空白的差距。我可以更改背景圖片是更廣泛,但對自己的最簡單的方法就是我上面

+0

也許XP和7的後屏幕截圖,所以我們可以看到你在說什麼? – Anders

回答

4

MUI解釋不調整基於Windows版本的窗口。但窗口大小受字體和DPI設置的影響。

使用WinVer.nsh來檢測Windows版本。該模塊默認包含在NSIS包含文件夾中。

5

如果Anders' answer是不夠明確的(我花了幾個小時得到它的權利),這裏是一個更「初學者的友好」的版本。

您將需要添加!include WinVer.nsh到cd.nsi文件的頂部。

然後,您可以使用這樣的代碼:

${If} ${IsWinXP} 
    MessageBox MB_OK|MB_ICONEXCLAMATION "We have Win XP" 
${EndIf} 

這是我測試的唯一功能,但WinVer.nsh文件有迷你手動與它的功能,其中包括啓動:

  • AtLeastWin<version>它至少按照規定檢查安裝程序是否在Windows版本上運行。
  • IsWin<version>它檢查安裝程序是否正確地按照指定的Windows版本運行。
  • AtMostWin<version>它檢查安裝程序是否在指定的最大Windows版本上運行。

<version>可以用下面的值替換(也許更多,這取決於你的WinVer.nsh文件的新舊程度):9598MENT42000XP2003Vista200872008R2

有一些更多的功能並且在一些WINVER使用的例子。NSH文件,這可能是位於象Ç地方:\ Program Files文件\ NSIS \包括,如:

  • AtLeastServicePack如果安裝在Windows服務包的版本至少爲指定運行的檢查。
  • IsServicePack它檢查安裝程序是否在Windows服務包版本上正確運行。
  • AtMostServicePack它檢查安裝程序是否最多按指定運行在Windows服務版本包上。
  • IsWin2003R2(沒有更多細節提供)
  • IsStarterEdition(提供無更多細節)
  • OSHasMediaCenter(沒有更多細節提供)
  • OSHasTabletSupport(沒有更多細節提供)
+1

N.B.根據http://nsis.sourceforge.net/Get_Windows_version頁面,「WinVer.nsh」已經過時了。最好添加'GetWindowsVersion'函數,它是[進一步在頁面下方](http://nsis.sourceforge.net/Get_Windows_version#Alternate_Script_With_Server_Versions)。這已經擴展到與Windows 10/Server 2016相匹配。只需將腳本複製並粘貼到「.nsi」文件的頂部。然後,您可以通過'$ {GetWindowsVersion} $ R0','StrCmp $ R0「10.0」win10 not_win10'比較輸出結果(如果您已經完成升級,您也可以在預計Windows 10時獲得Windows 7/8.1)。 – icc97

1

代碼段波紋管示出了如何識別Windows版本儘可能多的細節,我認爲是有用的:

!include WinVer.nsh 
!include "LogicLib.nsh" 

Function LogWinVer 

    ${WinVerGetMajor} $R0 
    ${WinVerGetMinor} $R1 
    ${WinVerGetBuild} $R2 
    ${WinVerGetServicePackLevel} $R3 

    ; determine windows product name 
    ${If} $R0 == 5 
      ${If} $R1 == 0 
        DetailPrint "Windows 2000 SP $R3" 
      ${ElseIf} $R1 == 1 
        DetailPrint "Windows XP SP $R3" 
      ${ElseIf} $R1 == 2 
        DetailPrint "Windows Server 2003 SP $R3" 
      ${EndIf} 
    ${ElseIf} $R0 == 6 
      ${If} $R1 == 0 
        ${If} ${IsServerOS} 
          DetailPrint "Windows Server 2008 SP $R3" 
        ${Else} 
          DetailPrint "Windows Vista SP $R3" 
        ${EndIf} 
      ${ElseIf} $R1 == 1 
        ${If} ${IsServerOS} 
          DetailPrint "Windows Server 2008 R2 SP $R3" 
        ${Else} 
          DetailPrint "Windows 7 SP $R3" 
        ${EndIf} 
      ${ElseIf} $R1 == 2 
        ${If} ${IsServerOS} 
          DetailPrint "Windows Server 2012 SP $R3" 
        ${Else} 
          DetailPrint "Windows 8 SP $R3" 
        ${EndIf} 
      ${ElseIf} $R1 == 3 
        ${If} ${IsServerOS} 
          DetailPrint "Windows Server 2012 R2 SP $R3" 
        ${Else} 
          DetailPrint "Windows 8.1 SP $R3" 
        ${EndIf} 
      ${EndIf} 
    ${EndIf} 

    ; version 
    DetailPrint "Kernel $R0.$R1 build $R2" 


    ; x86 or x64: 
    Call LogWinVer 
    System::Call "kernel32::GetCurrentProcess() i .s" 
    System::Call "kernel32::IsWow64Process(i s, *i .r0)" 
    StrCmp $0 "0" is32bit is64bit 

    is32bit: 
      DetailPrint "32 bit" 
      Goto exit 
    is64bit: 
      DetailPrint "64 bit" 
    exit: 
FunctionEnd 
1

你也可以直接從註冊表中讀取:

ReadRegStr $WinEdition HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "ProductName" 

接下來,你可以使用它比較「==」,例如:

${If} $WinEdition == "Windows XP" 

,或者您可以使用StrContains來檢查Windows版本包含「Windows XP」

+0

很好的解釋 – Mark