论坛风格切换切换到宽版
  • 6943阅读
  • 9回复

NSIS 的作業系統判斷方式 [复制链接]

上一主题 下一主题
离线kiiali
 
发帖
805
金钱
0
威望
0
只看楼主 倒序阅读 0 发表于: 2003-05-31
NSIS 的作業系統判斷方式
您好,弟是 Kii Ali
其實說起來很呆,說穿了就沒有什麼了。感謝 witch five ,如果
不是他點了一下,倒沒有想到這種呆方法。

■失敗案例
原先我是參考 一個 nsisos.dll 插件。這個東西來自於 vobsub 作者,手
上也有 vobsub 的範例可用。但是那一種是 NSIS 2.0a0 的寫法,使用
StrComp 的寫法,用在 2.0b 系列的不太好吧。新版的 manual 完全不
提此事,這是放棄的原因。如下:
短短幾行,用兩個字串比較的方式。很標準的舊寫法。Gabest 的寫法
Detecting OS Type 其實是蠻嚇人的。
─────────────────────
; Detecting OS type
  SetDetailsPrint None
  File /oname=$TEMPnsisos.dll nsisos.dll
  CallInstDLL $TEMPnsisos.dll osplatform
  Pop $R0
  Delete $TEMPnsisos.dll
  SetDetailsPrint Both
; Done Detecting OS Type
  StrCmp $R0 "WINNT" 0 DoElse0
StrCpy $R8 $SYSDIR
  Goto End0
  DoElse0:
StrCpy $R8 $WINDIR
  End0:
─────────────────────
■成功案例
說穿了不值一文。Win98 在 system 目錄下不會有 CMD.EXE ,而
Windows 2000 在 system32 目錄下,有。
所以就來檢查一下。
─────────────────────
; 檢查作業系統版本,然後把 Win98_checked 放在檔案尾端,加警告視窗。
IfFileExists "$SYSDIRcmd.exe" Win2k_checked Win98_checked
Win98_checked:
MessageBox MB_OK|MB_ICONINFORMATION "$(MSG_Win98_checked)"
Quit
Win2k_checked:
─────────────────────
然後給那些不信邪,一定要在 Win2k 安裝 Win98 版本的傢伙
,來點小小的警告。
─────────────────────
LangString MSG_Win98_checked ${LANG_ENGLISH}   "Your OS detected as Win98/SE/ME. It cannot install Unicode-at-on (Win2k/XP). Please download/install correct version."
LangString MSG_Win98_checked ${LANG_TRADCHINESE}   "偵測到你的系統是 Win98/SE/ME ,無法安裝 Unicode 補完計畫 (Win2k/XP) 。請下載/安裝正確版本。"
─────────────────────
當然你也可以不警告,就直接 Quit 掉,隨便你變化了,不是嗎?
搭配多語言 LangString 的方式,一樣完美,可不是?
又,你可以玩看看在 win2k 底下替 cmd.exe 改名。是可以改名,
也不會鎖定。但不到一秒鐘,系統又會生出另外一個 cmd.exe ,
想要騙 win2k 系統還真難騙啊。
自 2003 年起,Kii Ali 所有繁體版作品 "Help" 將譯為「幫助」,回歸軟體原始本意,不再遵照微軟的過度翻譯,而造成使用上的誤解。
离线kukuasir
发帖
*
金钱
*
威望
*
只看该作者 1 发表于: 2003-08-01
直接判断$SYSDIR是否为system32似乎也能达到目的的
9X始终都是SYSTEM这个目录
而2000/XP都是SYSTEM32吧
就算用9X升级到2000/XP系统目录也是会变的
离线莫名

发帖
1373
金钱
0
威望
0
只看该作者 2 发表于: 2003-08-01
NSIS 帮助文件中好象有一篇详细介绍识别是什么系统的示例,通过注册表识别。
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersion]
"CurrentVersion"="5.1"
好象是以上键值
离线莫名

发帖
1373
金钱
0
威望
0
只看该作者 3 发表于: 2003-08-01
NSIS 帮助文件中好象有一篇详细介绍识别是什么系统的示例,通过注册表识别。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"CurrentVersion"="5.1"
好象是以上键值
离线莫名

发帖
1373
金钱
0
威望
0
只看该作者 4 发表于: 2003-08-01
刚发现吃斜杠。
离线kiiali
发帖
805
金钱
0
威望
0
只看该作者 5 发表于: 2003-08-05
這種說法,似乎要使用 registry 才能判斷 2000/xp/2003
這三個版本。而我還不清楚 2003 與 xp 這個段落不同。

您那裡有沒有實作範例?我看一下。
自 2003 年起,Kii Ali 所有繁體版作品 "Help" 將譯為「幫助」,回歸軟體原始本意,不再遵照微軟的過度翻譯,而造成使用上的誤解。
离线莫名

发帖
1373
金钱
0
威望
0
只看该作者 6 发表于: 2003-08-05
我在当初制作 foobar2000 曾查看过 NSIS 的帮助文件,这是安装脚本的一段,比较简单,只是判断了一下是否为 NT 内核,就是说:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"CurrentVersion 的值为空是肯定是 9X 内核。

ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
  StrCmp $R0 "" 0 lbl_winnt
DetailPrint "你的电脑操作系统为 9X 内核,现在将安装 ANSI 版本"
File "filewin98foobar2000.exe"
goto lbl_OK
lbl_winnt:
DetailPrint "你的电脑操作系统为 NT 内核,现在将安装 Unicode 版本"
File "filewinntfoobar2000.exe"
lbl_OK:
......

以下是 NSIS 帮助文件中的说明:
; GetWindowsVersion
;
; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/
; Returns on top of stack
;
; Windows Version (95, 98, ME, NT x.x, 2000, XP, .NET Server)
; or
; '' (Unknown Windows Version)
;
; Usage:
;   Call GetWindowsVersion
;   Pop $R0
;   ; at this point $R0 is "NT 4.0" or whatnot

Function GetWindowsVersion
  Push $R0
  Push $R1
  ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
  StrCmp $R0 "" 0 lbl_winnt
  ; we are not NT.
  ReadRegStr $R0 HKLM SOFTWARE\Microsoft\Windows\CurrentVersion VersionNumber

  StrCpy $R1 $R0 1
  StrCmp $R1 '4' 0 lbl_error

  StrCpy $R1 $R0 3

  StrCmp $R1 '4.0' lbl_win32_95
  StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98

  lbl_win32_95:
  StrCpy $R0 '95'
  Goto lbl_done

  lbl_win32_98:
  StrCpy $R0 '98'
  Goto lbl_done

  lbl_win32_ME:
  StrCpy $R0 'ME'
  Goto lbl_done

  lbl_winnt:

  StrCpy $R1 $R0 1

  StrCmp $R1 '3' lbl_winnt_x
  StrCmp $R1 '4' lbl_winnt_x

  StrCpy $R1 $R0 3

  StrCmp $R1 '5.0' lbl_winnt_2000
  StrCmp $R1 '5.1' lbl_winnt_XP
  StrCmp $R1 '5.2' lbl_winnt_dotNET lbl_error

  lbl_winnt_x:
    StrCpy $R0 "NT $R0" 6
  Goto lbl_done

  lbl_winnt_2000:
    Strcpy $R0 '2000'
  Goto lbl_done

  lbl_winnt_XP:
    Strcpy $R0 'XP'
  Goto lbl_done

  lbl_winnt_dotNET:
    Strcpy $R0 '.NET Server'
  Goto lbl_done

  lbl_error:
  Strcpy $R0 ''
  lbl_done:
  Pop $R1
  Exch $R0
FunctionEnd

就是说,CurrentVersion 的值为 4.0 则是 NT 4.0,值为 5.0 则是 2000,值为 5.1 则是 XP,值是 5.2 则为 net,2003 我没有安装过,具体不能确定。

当然,如果这个值为空,则是 9X 内核,转到注册表以下键值判断:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion]
"Version"="Windwos 98" 那肯定是 98,Windows 95 印象中好象就是“Windows 95”,当时查过。
离线少昊
发帖
451
金钱
0
威望
0
只看该作者 7 发表于: 2003-08-06
我的 Y’z Dock 安装脚本,检测操作系统是否为 WinXP 或更新版本。
希望有帮助。

; 通用补丁发布安装脚本
;

; 启用外部压缩工具
!define HAVE_UPX

; 若启用了外部压缩工具,这进行可执行文件头的压缩
!ifdef HAVE_UPX
!packhdr tmp.dat "D:SystemUPXupx --best tmp.dat"
!endif

; 编译选项
; 选择压缩方式
SetCompressor bzip2

; 一般属性
; 完成后自动关闭安装程序
AutoCloseWindow true
; 使用小模式安装对话框
ChangeUI all "${NSISDIR}ContribUIssdbarker_tiny.exe"
; 安装程序图标
Icon "E:My DocumentsMy Datahanzify32.ico"
; 安装界面颜色配置
InstallColors 000000 FFFFFF
; 安装进度条风格
InstProgressFlags smooth colored
; 加载中文语言文件
LoadLanguageFile "${NSISDIR}ContribLanguage filesSimpChinese.nlf"
; 设置界面字体
SetFont 宋体 9
; 启用 XP 的视觉效果样式
XPStyle on


; 以下内容根据需要自行修改

; 标牌文字
BrandingText /LANG=2052 /TRIMLEFT "M.Yamaguchi"
; 自定义界面文本
DirText /LANG=2052 "安装 Y'z Dock 到您的计算机中" "在以下编辑框中输入安装路经:"
; 默认的安装目录
InstallDir "$PROGRAMFILESY'z Dock"
; 安装程序名称及版本
!define VERSIONNUM "0.8.3"
; 安装程序名称
Name "Y'z Dock ${VERSIONNUM}"
; 输出文件
OutFile "HA_YzDock083_SH.exe"

; 安装程序内容
Section "YzDock"
SetOutPath $INSTDIR
File /r "Yz Dock*.*"

MessageBox MB_YESNO "是否要在程序启动组中添加一个快捷方式?$n(这样每次登陆后就能自动运行)$n$n点击 [是] 就添加。若不需要就点击 [否]。" IDYES yesdo
Exec "$INSTDIRYzDock.exe"
ExecShell open "$INSTDIR使用帮助.txt"
Goto instover
yesdo:
CreateShortCut "$SMSTARTUPY'z Dock.lnk" "$INSTDIRYzDock.exe"
Exec "$INSTDIRYzDock.exe"
ExecShell open "$INSTDIR使用帮助.txt"
instover:
SectionEnd

; 安装程序初始化设置
Function .onInit
; 操作系统版本检测函数
ReadRegStr $R0 HKLM "SOFTWAREMicrosoftWindows NTCurrentVersion" CurrentVersion
StrCmp $R0 "5.1" startinst
StrCmp $R0 "5.2" startinst
MessageBox MB_OK "此程序只能运行在 Microsoft Windows XP 下!!!!$n$n请点击 [确定] 按钮退出此安装程序。"
  Abort
startinst:
FunctionEnd
我们的目标是——没有英文
离线名利浮云
发帖
*
金钱
*
威望
*
只看该作者 8 发表于: 2003-08-07
QUOTE(少昊 @ 2003年08月06日 18时26分)
我的 Y’z Dock 安装脚本,检测操作系统是否为 WinXP 或更新版本。
希望有帮助。

斜杠\都被吃掉了,能不能上传一个完整的脚本文档?谢谢!
离线少昊
发帖
451
金钱
0
威望
0
只看该作者 9 发表于: 2003-08-08
点击下载
附件: YzDock.nsi (2 K) 下载次数:1803
我们的目标是——没有英文