# NetHalt - NSIS installer script
# Copyright (C) 2008 Daniel Collins <solemnwarning@solemnwarning.net>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# * Neither the name of the author nor the names of its contributors may
# be used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
!include MUI2.nsh
!include LogicLib.nsh
!include nsDialogs.nsh
Name "NetHalt"
OutFile "nhclient.exe"
InstallDir $PROGRAMFILES\NetHalt
InstallDirRegKey HKLM "SOFTWARE\NetHalt" "InstallDir"
!define MUI_ABORTWARNING
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "COPYING"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Function .onInit
nsisos::osversion
${If} $0 < 5
MessageBox MB_OK "Windows 2000 (NT 5.0) or greater is required"
Abort
${EndIf}
FunctionEnd
# Do local install
#
Section "NetHalt"
SetShellVarContext all
SetOutPath $INSTDIR
# Stop all running nhtray.exe processes
#
StrCpy $0 "nhtray.exe"
KillProc::KillProcesses
# Check if the NetHalt service is installed
#
SimpleSC::ExistsService "nhclient"
Pop $0
# Stop+Remove the NetHalt service if it's installed
#
${If} $0 == 0
DetailPrint "Stopping NetHalt Client service..."
SimpleSC::StopService "nhclient"
DetailPrint "Removing NetHalt Client service..."
SimpleSC::RemoveService "nhclient"
${EndIf}
WriteRegStr HKLM "SOFTWARE\NetHalt" "InstallDir" $INSTDIR
cinst::reg_write "dword" "SOFTWARE\NetHalt" "use_server" "0"
cinst::reg_write "string" "SOFTWARE\NetHalt" "server_name" ""
cinst::reg_write "dword" "SOFTWARE\NetHalt" "server_port" "0"
cinst::reg_write "dword" "SOFTWARE\NetHalt" "server_refresh" "1800"
cinst::reg_write "dword" "SOFTWARE\NetHalt" "warning" "300"
cinst::reg_write "dword" "SOFTWARE\NetHalt" "abort" "0"
cinst::reg_write "dword" "SOFTWARE\NetHalt" "delay" "0"
cinst::reg_write "string" "SOFTWARE\NetHalt" "sdtimes" ""
WriteUninstaller "$INSTDIR\uninstall.exe"
File "src\nhclient.exe"
File "src\evlog.dll"
File "src\nhtray.exe"
File "src\nhconfig.exe"
# Add the event log source (evlog.dll) to the registry
#
WriteRegStr HKLM "SYSTEM\CurrentControlSet\Services\Eventlog\Application\NetHalt Client" "EventMessageFile" "$INSTDIR\evlog.dll"
WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Services\Eventlog\Application\NetHalt Client" "TypesSupported" 0x00000007
# Add the uninstaller to Add/Remove programs
#
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NetHalt" "DisplayName" "NetHalt"
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NetHalt" "UninstallString" "$INSTDIR\uninstall.exe"
WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NetHalt" "NoModify" 1
WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NetHalt" "NoRepair" 1
# Install and start the NetHalt service
# TODO: Check for errors
#
DetailPrint "Installing NetHalt Client service..."
SimpleSC::InstallService "nhclient" "NetHalt Client" "16" "2" "$INSTDIR\nhclient.exe" "" "" ""
DetailPrint "Starting NetHalt Client service..."
SimpleSC::StartService "nhclient"
# Add nhtray.exe to the registry to run at login
#
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" "NetHalt" "$INSTDIR\nhtray.exe"
# Launch nhtray.exe
#
Exec '"$INSTDIR\nhtray.exe"'
# Create shortcuts
#
CreateDirectory "$SMPROGRAMS\NetHalt"
CreateShortCut "$SMPROGRAMS\NetHalt\Tray Icon.lnk" "$INSTDIR\nhtray.exe"
CreateShortCut "$SMPROGRAMS\NetHalt\Configuration.lnk" "$INSTDIR\nhconfig.exe"
CreateShortCut "$SMPROGRAMS\NetHalt\Uninstall.lnk" "$INSTDIR\uninstall.exe"
SectionEnd
Function un.onInit
SetShellVarContext all
ReadRegStr $INSTDIR HKLM "SOFTWARE\NetHalt" "InstallDir"
MessageBox MB_YESNO "This will uninstall NetHalt, continue?" IDYES NoAbort
Abort
NoAbort:
FunctionEnd
Section "Uninstall"
# Stop and remove the NetHalt service
#
DetailPrint "Stopping NetHalt Client service..."
SimpleSC::StopService "nhclient"
DetailPrint "Removing NetHalt Client service..."
SimpleSC::RemoveService "nhclient"
# Stop all running nhtray.exe processes
#
StrCpy $0 "nhtray.exe"
KillProc::KillProcesses
# Delete shortcuts
#
Delete "$SMPROGRAMS\NetHalt\Tray Icon.lnk"
Delete "$SMPROGRAMS\NetHalt\Configuration.lnk"
Delete "$SMPROGRAMS\NetHalt\Un-Install.lnk"
Delete "$SMPROGRAMS\NetHalt"
DeleteRegValue HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" "NetHalt"
DeleteRegKey HKLM "SYSTEM\CurrentControlSet\Services\Eventlog\Application\NetHalt Client"
DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NetHalt"
Delete "$INSTDIR\nhclient.exe"
Delete "$INSTDIR\evlog.dll"
Delete "$INSTDIR\nhtray.exe"
Delete "$INSTDIR\uninstall.exe"
RMDir $INSTDIR
SectionEnd
标签归档:NSIS
NSIS实现安装前先停止并卸载旧版
以下脚本会先找到正在运行的程序和服务,停止并删除服务,然后杀掉正在运行的程序进程
;检查服务是否存在
SimpleSC::ExistsService "${SVCHOST_EXE_NAME}"
Pop $0
;停止并删除服务
${If} $0 == 0
DetailPrint "停止正在运行的打印服务"
SimpleSC::StopService "${SVCHOST_EXE_NAME}" 1 30
DetailPrint "删除已安装的打印服务"
SimpleSC::RemoveService "${SVCHOST_EXE_NAME}"
${EndIf}
;检查主程序是否运行,如果正在运行则进行终止
nsProcess::_FindProcess "${ANALYST_EXE_NAME}"
Pop $R0
${If} $R0 = 0
DetailPrint "停止正在运行的主程序"
nsProcess::_KillProcess "${ANALYST_EXE_NAME}"
Pop $R0
${EndIf}
;检查升级程序是否运行,如果正在运行则进行终止
nsProcess::_FindProcess "${UPDATE_EXE_NAME}"
Pop $R0
${If} $R0 = 0
DetailPrint "停止正在运行的升级程序"
nsProcess::_KillProcess "${UPDATE_EXE_NAME}"
Pop $R0
${EndIf}
NSIS递归添加和删除子目录及文件
NSIS打包比较配置文件手动编辑起来非常麻烦,使用HM NIS EDIT
向导的话就容易多了。
添加目录以及子目录文件
File /r "bin\Release\*.*"
删除目录以及子目录
RMDir /r "$INSTDIR"