社区应用 最新帖子 精华区 社区服务 会员列表 统计排行
  • 2127阅读
  • 2回复

[分享]通用PE工具箱1.7 NSIS 打包安装脚本

楼层直达
级别: 管理员
发帖
27814
飞翔币
1567
威望
888
飞扬币
129967
信誉值
0

; 通用 PE 工具箱安装脚本
;大体流程:
;1、初始化阶段:包括定义几个变量,预解压页面文件等
;2、读取用户设置:名称、等待时间,外置目录、桌面壁纸等
;3、判断版本号,分别按不同模式进行引导的设置。
;4、解压文件:PE核心,外置程序,引导文件等
;5、设置启动密码并对PE核心和引导文件进行隐藏处理
;6、创建卸载程序和开始菜单
;7、把安装时的部分信息保存到注册表中以便卸载程式等后期程序的使用

/******************************
------------------------------
下面开始了
------------------------------
******************************/

; 定义几个常量
!define PRODUCT_NAME "通用 PE 工具箱"
!define PRODUCT_VERSION "1.7"
!define PRODUCT_PUBLISHER "通用"
!define PRODUCT_WEB_SITE "http://www.ton6.cn"

; 卸载位置
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

; 下面是一些美化:
!define MUI_ABORTWARNING
!define MUI_ICON "E:\Program Files\VIT\图标\国际\Olympic.ico"
;!define MUI_WELCOMEFINISHPAGE_BITMAP "C:\program Files\NSIS\Contrib\Graphics\Wizard\orange.bmp"
!define MUI_WELCOMEFINISHPAGE_BITMAP "D:\ton\ba.bmp"
!define MUI_WELCOMEPAGE_TEXT "  通用 PE 工具箱是一款安装在硬盘使用的Windows PE工具集合,我们可以用它来实现系统的维护,我们可以使用它来修改密码,备份还原系统等。它运行快速,界面简洁,并且可以高度自定义。作为一个应急维护工具箱,我们相信它是您最好的选择!\r\n\r\n\r\n    欢迎访问 www.ton6.cn下载工具插件,获取更多信息。\r\n\r\n\r\n  祝福北京,祝福中国。北京加油,中国加油!\r\n\r\n\r\n  $_CLICK"
!define MUI_WELCOMEPAGE_TITLE "\r\n    欢迎使用 通用 PE 工具箱"
!define MUI_unICON "E:\Program Files\VIT\图标\国际\Olympic.ico"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "D:\ton\yemei.bmp"
!include "MUI.nsh"

;压缩率
SetCompressor /SOLID lzma

; 欢迎页面
!insertmacro MUI_PAGE_WELCOME

; 自定义的设置页面
Page custom SetCustom ValidateCustom

; 安装过程页面
!insertmacro MUI_PAGE_INSTFILES

; 安装完成页面
!define MUI_FINISHPAGE_RUN_text "同时生成通用 PE 工具箱光盘版"
!define MUI_FINISHPAGE_RUN "$INSTDIR\PETools\makeiso.exe"
!define MUI_FINISHPAGE_RUN_NOTCHECKED
!insertmacro MUI_PAGE_FINISH

; 安装卸载过程页面
!insertmacro MUI_UNPAGE_INSTFILES

; 安装界面包含的语言设置
!insertmacro MUI_LANGUAGE "SimpChinese"

; 安装预释放文件
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS

;标题和名称,这里用的是上面定义好滴。
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"

;输出文件名
OutFile "Setup.exe"

;显示安装/卸载列表
ShowUnInstDetails show
ShowInstDetails show

;左下侧的文字
BrandingText "作者:Uepon"

;预解压几个文件
ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll"
ReserveFile "D:\ton\SET.ini"
ReserveFile "D:\ton\ISVISTA.cmd"

;定义几个变量
Var SYSDRIVE
var BOOTNAME
var WAITTIME
var PROGRAMS
var IFREADON
var IFHIDEON
var PEMIMAA
var PEMIMAB
var IFVISTA
var WALLJPG

;下面为判断系统版本并复制必要文件的部分
;首先判断系统是9X还是NT,若为9X,则提示退出
;若为NT则继续判断具体的系统,若为2003,则不复制NTLDR,
;XP、2000则复制
;若为VISTA,则启动VISTA安装模式
section "FindWindows"

   ;判断是9X还是NT
   ClearErrors
   ReadRegStr $R0 HKLM \
   "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
   IfErrors 0 IS_winnt

   ;是9X
   DetailPrint "系统检测到你的系统是 9X 平台"
   MessageBox   MB_ICONSTOP   "本工具暂时不能在你的系统里安装使用,请先退出!"
   Quit

   ;是NT
   IS_winnt:
   DetailPrint "系统检测到你的操作系统是 NT 平台,程序继续运行"
   StrCpy $R1 $R0 3
   StrCmp $R1 '6.0' ISVISTA NOTISVISTA

   ISVISTA:
   Strcpy $R0 'Vista'
   Strcpy $IFVISTA 'Vista'
   DetailPrint "你的操作系统为 Windows $R0 需要执行Vista安装模块"
   File /oname=$PLUGINSDIR\ISVISTA.cmd "D:\ton\ISVISTA.cmd"
   SetOutPath "$WINDIR\"
   file "D:\ton\UNPEBOOT.CMD"
   ExecCmd::exec 'CMD /c $PLUGINSDIR\ISVISTA.cmd "$WAITTIME" "$BOOTNAME"'
   SetOutPath "$SYSDRIVE"
   SetOverwrite on

   NOTISVISTA:
sectionend


;下面为复制PE文件、引导、外置程序的部分
Section "Copyfiles" SEC01

;复制外置程序
DetailPrint "安装外置程序到您选择的 $PROGRAMS 分区"
SetOutPath "$PROGRAMS"
SetOverwrite ifdiff
; File /r "D:\ton\waizhi\*.*"

;复制PE引导、PE核心文件
ReadEnvStr $SYSDRIVE "SYSTEMDRIVE"
DetailPrint "复制系统文件和PE核心到您的系统分区$SYSDRIVE"
SetOutPath "$SYSDRIVE"
SetOverwrite ifdiff
; File /r "D:\ton\PEFILE\*.*"
IfFileExists "$WALLJPG" 0 NOCOPYWALL
CopyFiles /SILENT "$WALLJPG" "$PROGRAMS\PETools\WALLPAPER.JPG"
NOCOPYWALL:
SectionEnd

;下面是对PE文件、引导、外置程序设置属性的部分
Section "SetBoot"

;读取%systemdrive%
ReadEnvStr $SYSDRIVE "SYSTEMDRIVE"

;添加引导。设置BOOT属性为隐藏、只读、系统。把等待时间改为4
;若为VISTA,则不编辑BOOT。INI
StrCmp $IFVISTA 'Vista' NOSETBOOT
SetFileAttributes "$SYSDRIVE\BOOT.INI" NORMAL
SetFileAttributes "$SYSDRIVE\BOOT.INI" ARCHIVE
WriteINIStr "$SYSDRIVE\BOOT.INI" "operating systems" "$SYSDRIVE\WXPE\PELOAD" "$BOOTNAME"
DetailPrint "设置开机等待选择菜单为 $BOOTNAME"
WriteINIStr "$SYSDRIVE\BOOT.INI" "boot loader""timeout""$WAITTIME"
DetailPrint "设置开机等待时间为 $WAITTIME 秒"
SetFileAttributes "$SYSDRIVE\BOOT.INI" HIDDEN|READONLY|system|ARCHIVE
NOSETBOOT:
SectionEnd

Section "SETPASSWORD"

;根据选择对PE进行密码设置
StrCmp $PEMIMAA "" NOSETMIMA
ExecCmd::exec "CMD /C Echo password $PEMIMAA>>$SYSDRIVE\PELDR"
DetailPrint "为您的PE设置启动密码"

NOSETMIMA:
ExecCmd::exec "CMD /C Echo find --set-root /PELDR"
ExecCmd::exec "CMD /C Echo chainloader /WXPE/LDRXPE>>$SYSDRIVE\PELDR"
SetFileAttributes "$SYSDRIVE\WXPE" HIDDEN|READONLY|system|ARCHIVE
SetFileAttributes "$SYSDRIVE\WXPE\BFONT.B" HIDDEN|READONLY|system|ARCHIVE
SetFileAttributes "$SYSDRIVE\WXPE\LDRXPE" HIDDEN|READONLY|system|ARCHIVE
SetFileAttributes "$SYSDRIVE\WXPE\NTDET.C" HIDDEN|READONLY|system|ARCHIVE
SetFileAttributes "$SYSDRIVE\WXPE\PE.X" HIDDEN|READONLY|system|ARCHIVE
SetFileAttributes "$SYSDRIVE\WXPE\PELOAD" HIDDEN|READONLY|system|ARCHIVE
SetFileAttributes "$SYSDRIVE\WXPE\WINPE.IM_" HIDDEN|READONLY|system|ARCHIVE
SetFileAttributes "$SYSDRIVE\PELDR" HIDDEN|READONLY|system|ARCHIVE
Sectionend

Section "FINDHIDE"
;根据选择决定是否将外置程序设置为隐藏
strCmp $IFHIDEON "0" NOHIDEON
SetFileAttributes "$PROGRAMS\PEtools" HIDDEN
NOHIDEON:
Sectionend

Section "FINDREAD"
;根据选择决定是否将外置程序设置为只读、系统
strCmp $IFREADON "0" NOREADON
ExecCmd::exec "CMD /C ATTRIB +S +R $PROGRAMS\PEtools\*.* /S /D"
NOREADON:
Sectionend

;创建快捷方式、添加卸载注册表的部分
Section Post

;创建卸载程序
WriteUninstaller "$WINDIR\uninst.exe"

;创建卸载注册表
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$WINDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$WINDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Programdir" "$PROGRAMS"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "IFREADON" "$IFREADON"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "IFHIDEON" "$IFHIDEON"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "PEMIMA" "$PEMIMAA"

;创建快捷方式
SetOutPath "$WINDIR\"
WriteIniStr "$WINDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
CreateDirectory "$SMPROGRAMS\通用 PE 工具箱"
CreateShortCut "$SMPROGRAMS\通用 PE 工具箱\访问官方网站.lnk" "$WINDIR\${PRODUCT_NAME}.url"
CreateShortCut "$SMPROGRAMS\通用 PE 工具箱\卸载.lnk" "$WINDIR\uninst.exe"
CreateShortCut "$SMPROGRAMS\通用 PE 工具箱\光盘PE制作工具.lnk" "$PROGRAMS\PEtools\makeiso.exe"
CreateShortCut "$SMPROGRAMS\通用 PE 工具箱\U盘PE制作工具.lnk" "$PROGRAMS\PEtools\makeu.exe"

SectionEnd

;函数体要放到正文后面,避免错误啊。
;初始化函数
Function .onInit

InitPluginsDir
File /oname=$PLUGINSDIR\SET.ini "D:\ton\SET.ini"
SetOverwrite oFF
SetOutPath "$SYSDIR\"
File /R "D:\ton\INS\*.*"
;将当前的系统目录作为
ReadEnvStr $SYSDRIVE "SYSTEMDRIVE"
WriteINIStr "$PLUGINSDIR\SET.ini" "Field 6" "State" "D:\"
WriteINIStr "$PLUGINSDIR\SET.ini" "Field 6" "text" "D:\"

ReadregStr $PROGRAMS HKLM "Software\MicRosoft\Windows\CurrentVersion\Uninstall\通用 PE 工具箱" "Programdir"
IfFileExists "$PROGRAMS\PETools\Setting.ini" 0 nodir
MessageBox MB_OK "检测到系统已安装通用 PE 工具箱,程序将自动覆盖安装。"
WriteINIStr "$PLUGINSDIR\SET.ini" "Field 6" "State" "$PROGRAMS\"
WriteINIStr "$PLUGINSDIR\SET.ini" "Field 6" "text" "$PROGRAMS\"
nodir:

FunctionEnd

;下面的函数自定义页面时用到
Function SetCustom

!insertmacro MUI_HEADER_TEXT "PE工具箱综合设置" "请输入或选择相关的设置,单击[安装(I)]按钮开始安装。"
InstallOptions::dialog "$PLUGINSDIR\SET.ini"

FunctionEnd

Function ValidateCustom

;读取用户输入的数值
ReadINIStr $BOOTNAME "$PLUGINSDIR\SET.ini" "Field 3" "State"
ReadINIStr $WAITTIME "$PLUGINSDIR\SET.ini" "Field 4" "State"
ReadINIStr $PROGRAMS "$PLUGINSDIR\SET.ini" "Field 6" "State"
ReadINIStr $IFREADON "$PLUGINSDIR\SET.ini" "Field 7" "State"
ReadINIStr $IFHIDEON "$PLUGINSDIR\SET.ini" "Field 8" "State"
ReadINIStr $PEMIMAA "$PLUGINSDIR\SET.ini" "Field 11" "State"
ReadINIStr $PEMIMAB "$PLUGINSDIR\SET.ini" "Field 13" "State"
ReadINIStr $WALLJPG "$PLUGINSDIR\SET.ini" "Field 15" "State"
StrCmp $PEMIMAA $PEMIMAB MIMAOK MIMANO

MIMANO:
   MessageBox   MB_ICONSTOP   "两次输入的密码不同,请重新输入!"
   Abort
MIMAOK:
;将盘符后面的"\"去掉
StrCpy $PROGRAMS "$PROGRAMS" -1
StrCpy $INSTDIR $PROGRAMS
FunctionEnd


/******************************
------------------------------
以下是安装程序的卸载部分
------------------------------
******************************/

Section Uninstall

;读取几个变量
ReadEnvStr $SYSDRIVE "SYSTEMDRIVE"
ReadregStr $PROGRAMS ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Programdir"

;删除文件
Delete "$WINDIR\${PRODUCT_NAME}.url"
Delete "$WINDIR\uninst.exe"
Delete "$SYSDRIVE\PELDR"
Delete "$SYSDRIVE\WXPE\WINPE.IM_"
RMDir /r "$SYSDRIVE\WXPE"
RMDir /r "$PROGRAMS\PETools"

;删除引导、设置BOOT属性为隐藏,只读,系统

SetFileAttributes "$SYSDRIVE\BOOT.INI" NORMAL
SetFileAttributes "$SYSDRIVE\BOOT.INI" ARCHIVE
DELETEINIStr "$SYSDRIVE\BOOT.INI" "operating systems" "$SYSDRIVE\WXPE\PELOAD"
SetFileAttributes "$SYSDRIVE\BOOT.INI" HIDDEN|READONLY|system|ARCHIVE

;删除快捷方式
RMDir /r "$SMPROGRAMS\通用 PE 工具箱"

;删除卸载注册表
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
SetAutoClose true

IfFileExists "$WINDIR\UNPEBOOT.CMD" UNPEBOOT NOVISTA
UNPEBOOT:
ExecCmd::exec /wait "CMD /C $WINDIR\UNPEBOOT.CMD"
Delete "$WINDIR\UNPEBOOT.CMD"
NOVISTA:
SectionEnd

;卸载用的几个函数
Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确实要完全移除 $(^Name) ,及其所有的组件?" IDYES +2
Abort
FunctionEnd

Function un.onUninstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从你的计算机移除。"
FunctionEnd
 
级别: 光盘见习
发帖
186
飞翔币
48
威望
5
飞扬币
699
信誉值
0
只看该作者 1 发表于: 2011-11-11
深不可测,纯支持一下老大
级别: 优秀会员
发帖
16940
飞翔币
824
威望
8332
飞扬币
12503
信誉值
0

只看该作者 2 发表于: 2011-11-13


楼主辛苦了。