IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权

原文:IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权

上一篇: IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权

本文经原作者特许授权于海洋女神发布,转载请务必注明出处与链接;原作者和海洋女神保留对该文的一切法律许可下的权益;需要发布在盈利性报刊、网站等请与原作者或海洋女神联系。

第三部分:使用IS2009
向导设置
1. 打开 InstallShield2009,新建一个Installscript MSI Project,建议选择此工程,因为该工
程支持脚本编写。选择类型为Windows Installer > InstallScript MSI Projcet

2. 进入IS 向导设置界面,下面我们分别进行设置。下图为Application Information 页面

3. 点击导航,进入Installation Architecture页面,选择YES设置软件组件结构。Files 为安
装文件,Database为数据库文件。



 

 

4. 点击导航,进入Application Files 页面,设置安装目标文件夹,并且在database 文件夹
下添加如下文件。

 

安装设计
1. 在向导设置中进行简单操作后,进入安装设计标签页面。

2. 在基本设置页面查看安装目录和语言设置

3. 在Organization –>Features中设置安装路径,以及其他的设置。下图为Files 的设置

下图为Database的设置,注意目标路径为[INSTALLDIR]Database,该文件夹是在Files文件夹
下的目录。



 

 

 

请设置好OnInstalling、OnInstalled、OnUninstalling、OnUnistalled选项。该选项允许用
户指定和调用相关的Install Scripe 函数。后边我们在IS 中的脚本编程中将讲到如何在这些
函数中写代码。

4. 用户也可以在Application Data ->Files and Folders 中查看或添加修改文件。

5. 在Behavior and Logic—>Support Files/Billboards中的Disk1下添加需要安装包支持的文件
和文件夹。Win32 文件夹是存放基础脚本的文件夹;database文件夹是Oracle的安装文件夹;
Temp_10G.dbc和Temp_10G.dfb 为建库模板文件。



以上步骤完成了IS中的基本设置和安装设置,只要是目录结构的选择,Files文件夹是
安装程序文件的文件夹,它的参数是[INSTALLDIR]。它的目录下是Database文件夹。参数
是[INSTALLDIR]Database。另外注意,3 个脚本文件必须放在指定的文件夹位置,这关系
到脚本语言中的相互调用。
支持文件将存放在光盘的跟目录下,这给我们直接调用这些文件带来了方便。

 

第四部分:IS2009中的脚本编程
传递源路径参数
用户在使用IS 安装过程中,我们不能够将所有信息都复制到本地硬盘进行安装,通常
情况下会读取源盘上的一些信息,譬如光盘下的某个路径中的内容。但是如何获取安装的路
径信息呢?又如何让批处理文件获知这些内容呢?
这里我们用到IS函数库中的3个函数:
BatchAdd(添加一个环境变量到一个批处理文件)
BatchFileLoad(把一个批处理文件装入内存来用高级批处理函数编辑它)
BatchFileSave(保存一个由BatchFileLoad装入的批处理文件)
BatchAdd函数插入一个SET命令或其它DOS命令到一个已经由BatchFileLoad装入内
存的批处理文件中。参数nOptions 使你可以将新命令添加到文件的第一个或最后一个语句,
用新命令取代一个现存语句,或指定将新命令添加到一个现存语句的前面或后面。调用
BatchAdd前,你必须调用BatchFileLoad来把要修改的文件装入内存。在你修改该文件后,
调用BatchFileSave来把它保存到磁盘。
下面我们在IS2009 中去使用这些函数。
1. 在 Installation Designer 中选择IS左边栏的Behavior and Logic中的InstallScript。
2. 在脚本框的上方,下拉选择框,选择Files
3. 之后,选择右边的下拉框,选择Installed
之所以选择Installed,是因为安装过程中会把Install.bat 批处理脚本复制到本地硬盘,
只有在成功复制之后,我们才能调用该批处理脚本,使用这些函数。
如图所示:

Installed 函数中的具体脚本如下:

#define EXAMPLE_BAT INSTALLDIR^"Database\\install.bat"
#define EXAMPLE_BAK "install.bak"
export prototype DefaultFeature_Installed();
function DefaultFeature_Installed()
STRING TARG,SOURCE,TARG1;
STRING DBPATH,DATA,DATAsur,TITLE;
begin
// Load the batch file to be edited.
if (BatchFileLoad (EXAMPLE_BAT) < 0) then
MessageBox ("Unable to load " + EXAMPLE_BAT+".", SEVERE);
abort;

endif;
DBPATH = SRCDISK + "\\";
// Add the line SET PATH = SRCDISK+"\\”.
if (BatchAdd ("SOURPATH", DBPATH, "", BEFORE) < 0) then
MessageBox ("Second call to BatchAdd failed", WARNING);
abort;
endif;
// Save the updated file; back up the original file.
if (BatchFileSave(EXAMPLE_BAK) < 0) then
MessageBox ("Unable to save " + EXAMPLE_BAK + ".", SEVERE);
//else
// MessageBox ("Batch file saved. Backup created.",INFORMATION);
endif;

该脚本中,我们定义Install.bat 的安装路径,并且在开始处用BatchFileLoad函数调用它,
注意,该调用并不是执行它,而是在内存中临时调用。然后设置一个变量DBPATH = SRCDISK
+ "\\",SRCDISK 是IS判断Setup.inx所在的位置,取出安装盘符,当然我们后边要加上反斜
杠。譬如光盘在F:我们这样做的目的就是在批处理的第一行插入Set SOURPATH = F:\ 。
BatchAdd 函数用于加载这个变量,保证在该批处理文件中最开始就设置这一变量。最后使
用BatchFileSave保存批处理文件。
同样,在卸载时候我们同样需要在Deinstall.bat 中这样去做,只是位置要确定在
Uninstalling,并且定义deinstall.bat 的安装路径即可。

UnInstalling 函数中的具体脚本如下:
#define UNINSTALL_BAT INSTALLDIR^"Database\\deinstall.bat"
#define UNINSTALL_BAK "deinstall.bak"
export prototype DefaultFeature_UnInstalling();
function DefaultFeature_UnInstalling()
STRING TARG,SOURCE;
STRING DBPATH,DATA,DATAsur,TITLE;
begin
// Load the batch file to be edited.
if (BatchFileLoad (UNINSTALL_BAT) < 0) then
MessageBox ("Unable to load " + EXAMPLE_BAT+".", SEVERE);
abort;
endif;
DBPATH = SRCDISK + "\\";
// Add the line SET PATH = SRCDISK+"\\".
if (BatchAdd ("SOURPATH", DBPATH, "", BEFORE) < 0) then
MessageBox ("Second call to BatchAdd failed", WARNING);
abort;
endif;
// Save the updated file; back up the original file.
if (BatchFileSave(UNINSTALL_BAK) < 0) then
MessageBox ("Unable to save " + UNINSTALL_BAK + ".", SEVERE);

//else
// MessageBox ("Batch file saved. Backup created.",INFORMATION);
endif;

执行批处理文件
我们修改完批处理文件,就要在修改保存之后执行它。这需要用到Is 函数库中的
LaunchAppAndWait()函数
语法:LaunchAppAndWait (szProgram, szCmdLine, lWait);
说明:LaunchAppAndWait函数运行由szProgram指定的带有szCmdLine指定的命令行
参数的应用程序。第三个参数,lWait 指示安装在继续前是否要等待直到运行的应用程序终
止。
一个安装程序只能监控由szProgram 指定的应用程序;如果该应用程序要运行其它应
用程序或进程,安装程序不能监控它们。因此,安装程序将在第一个应用程序结束后继续,
即使那时由第一个应用程序运行的其它应用程序仍在运行。注意如果运行的应用程序终止失
败,则安装程序将无限等待运行的应用程序完成。
添加在Installed脚本的后面:
TARG = INSTALLDIR^"Database";
if (LaunchAppAndWait(INSTALLDIR^"Database\\install.bat",TARG,LAAW_OPTION_WAIT |
LAAW_OPTION_HIDDEN) < 0) then
MessageBox ("Unable to launch install.bat",SEVERE);
endif;
end;
LAAW_OPTION_HIDDEN 这个参数是隐藏bat 的执行窗口, 它与
LAAW_OPTION_WAIT并用是隐藏并且等待程序执行完成后返回,注意他们的前后顺序。
添加在UnInstalling脚本的后面:

TARG = INSTALLDIR^"Database";
if
(LaunchAppAndWait(INSTALLDIR^"Database\\deinstall.bat",TARG,LAAW_OPTION_WAIT |
LAAW_OPTION_HIDDEN) < 0) then
MessageBox ("Unable to launch deinstall.bat",SEVERE);
endif;
end;
脚本已经完成,我们编译脚本,并确定没有任何的问题。

第五部分:其他
修改界面风格
1. 在 Installation Designer 中选择IS左边栏的User Interface中的Dialogs
2. 在右边窗口中选择Skins,选择之后点击Select
3. 界面窗口风格改变



 

编译打包
1. 在 Installation Designer 中选择IS左边栏的Media 中的Realrases
2. 在右边栏Releases点击右键,选择ReleasesWizard…
3. 出现向导界面
4. 在该界面中,注意几个界面,其余均为默认
5. Filter Setting界面,不要做任何的选择
6. Media Type界面,选择Network Image

 

注意:该地点不要选择过滤!!默认即可,若选择,导致读取光盘1158问题!上图为错误图

 

完整的安装包文件

第六部分:遇到的问题
1158问题:过滤语言操作导致,不选择过滤项即可
中文输入乱码问题:在向导中进行中文输入即可
环境变量问题:由于IS提供设置环境变量的功能,先开始认为在IS中设置环境变量就可以
通过bat去读取,但是这样做是错误的,变量是可以添加成功,但不允许该次的调用,所以
放弃了这种方法,改用函数。
设计思路问题:先开始是创建新库,并分别导入表,创建用户,导入数据,这样做麻烦的要
死,参数问题不断。后来改用数据模板建库。
目录问题:开始是这样打算的,把文件和数据库用不同的目录区分开,UI 中出现两个路径
选择页面,可是IS中只提供一个安装INSTALLDIR 的目录的参数,另外一个目录路径我不
知道如何获取和调用。故采用在INSTALLDIR目录下又创建了Database文件夹。
第七部分:总结
本人第一次使用IS,走了不少弯路,先开始用IS Express版本,发现根本无法使用脚本,改
成IS09,由于对Oracle 的不熟悉,批处理的不熟悉,IS 编程语言的不熟悉,导致此次制作
过程颇为漫长。零零散散历时一个多月的时间。
这里要感谢IS群的帮助,是他们给我前进的动力。问题一一排除,最终做好产品,提交Oracle。
特别感谢,海洋女神,奕婷,Blue,宇心,csp等等。。。
以上全部内容仅仅包含ORACLE 的打包,公司的产品应用并没有放在其中。
IS 群19622645 空白制作QQ:28021418

 

部分源代码
export prototype New_Feature_Installing();
function New_Feature_Installing()
begin
end;
//---------------------------------------------------------------------------
// The Installing event is sent before the feature DefaultFeature
// is installed.
//---------------------------------------------------------------------------
export prototype DefaultFeature_Installing();
function DefaultFeature_Installing()
STRING diskpath,szCommand,szCmdLine,szCommandecp,szCmdLineecp;
begin
diskpath = SRCDISK + "\\"; //定义安装盘路径
//运行framework20安装程序
if (LaunchAppAndWait(SRCDIR^"supportfiles\\dotnetfx.exe","",LAAW_OPTION_WAIT/* |
LAAW_OPTION_HIDDEN*/) < 0) then
MessageBox ("Unable to launch dotnet",SEVERE);
endif;
if
(LaunchAppAndWait(SRCDIR^"supportfiles\\framwork2.0\\setup.exe","",LAAW_OPTION_WAIT/*
|
LAAW_OPTION_HIDDEN*/) < 0) then
MessageBox ("Unable to launch dotnet2",SEVERE);
endif;
//定义MSI文件参数及MSI文件位置
szCommand = WINSYSDIR^"msiexec.exe";
LongPathToShortPath(szCommand);
szCmdLine =SRCDIR^"supportfiles\\EngineRT\\setup.msi";
LongPathToShortPath(szCmdLine);
//运行MSI文件
if (LaunchAppAndWait( szCommand,"/i"+szCmdLine,LAAW_OPTION_WAIT) < 0) then
MessageBox ("Unable to launch ACGIS",SEVERE);
endif;
// szCommandecp = SRCDIR^"supportfiles\\SoftwareAuthorization.exe";
// LongPathToShortPath(szCommandecp);
// szCmdLineecp =SRCDIR^"supportfiles\\license.ecp";
// LongPathToShortPath(szCmdLineecp);

if (LaunchAppAndWait(SRCDIR^"supportfiles\\Runecp.bat",diskpath,LAAW_OPTION_WAIT/*
|
LAAW_OPTION_HIDDEN*/) < 0) then
MessageBox ("Unable to launch ecp",SEVERE);
endif;
end;
//---------------------------------------------------------------------------
// The Installed event is sent after the feature DefaultFeature
// is installed.
//---------------------------------------------------------------------------
#define EXAMPLE_BAT INSTALLDIR^"Database\\install.bat"
#define EXAMPLE_BAK "install.bak"
export prototype DefaultFeature_Installed();
function DefaultFeature_Installed()
STRING TARG,SOURCE,TARG1;
STRING DBPATH,DATA,DATAsur,TITLE;
begin
// Load the batch file to be edited.
if (BatchFileLoad (EXAMPLE_BAT) < 0) then
MessageBox ("Unable to load " + EXAMPLE_BAT+".", SEVERE);
abort;
endif;
DBPATH = SRCDISK + "\\";
// Add the line SET PATH = SRCDISK^"test".
if (BatchAdd ("SOURPATH", DBPATH, "", BEFORE) < 0) then
MessageBox ("Second call to BatchAdd failed", WARNING);
abort;
endif;
// Save the updated file; back up the original file.

if (BatchFileSave(EXAMPLE_BAK) < 0) then
MessageBox ("Unable to save " + EXAMPLE_BAK + ".", SEVERE);
//else
// MessageBox ("Batch file saved. Backup created.",INFORMATION);
endif;
//DATAsur = "C:\\";
//DATA = SRCDISK^"test";
// TITLE = "Path buffer example";
// PathSet (DATAsur);
//SprintfBox (INFORMATION,TITLE,
// "The starting search path is %s.",DATAsur);
// if (PathAdd(DATA, "", FULL, BEFORE) < 0) then
// MessageBox ("Unable to add DATA Path to path buffer.", SEVERE);
// abort;
// endif;
// PathGet (DATAsur);
//SprintfBox (INFORMATION,TITLE,
// "DATA Path added before first path.\n\nThe search path is %s.",
// DATAsur);
TARG = INSTALLDIR^"Database";
// SOURCE = SRCDISK^"test";
// LaunchAppAndWait(SRCDIR^"path.bat",SOURCE,WAIT);

if (LaunchAppAndWait(INSTALLDIR^"Database\\install.bat",TARG,LAAW_OPTION_WAIT |
LAAW_OPTION_HIDDEN) < 0) then
MessageBox ("Unable to launch install.bat",SEVERE);
endif;
//Delay(1);
// LaunchAppAndWait(INSTALLDIR^"createdb.bat",TARG,LAAW_OPTION_WAIT);
//Delay(2);
// LaunchAppAndWait(SRCDISK^"test//sqlscript//setup.bat",TARG,LAAW_OPTION_WAIT);
// Delay(2);
// LaunchAppAndWait(SRCDISK^"test//sqlscript//importdb.bat",TARG,LAAW_OPTION_WAIT);
end;
//---------------------------------------------------------------------------
// The UnInstalling event is sent just before the feature
// DefaultFeature is uninstalled.
//---------------------------------------------------------------------------
#define UNINSTALL_BAT INSTALLDIR^"Database\\deinstall.bat"
#define UNINSTALL_BAK "deinstall.bak"
export prototype DefaultFeature_UnInstalling();
function DefaultFeature_UnInstalling()
STRING TARG,SOURCE;
STRING DBPATH,DATA,DATAsur,TITLE;
begin
// Load the batch file to be edited.
if (BatchFileLoad (UNINSTALL_BAT) < 0) then
MessageBox ("Unable to load " + EXAMPLE_BAT+".", SEVERE);
abort;
endif;
DBPATH = SRCDISK + "\\";
// Add the line SET PATH = SRCDISK^"test".
if (BatchAdd ("SOURPATH", DBPATH, "", BEFORE) < 0) then
MessageBox ("Second call to BatchAdd failed", WARNING);
abort;
endif;

// Save the updated file; back up the original file.
if (BatchFileSave(UNINSTALL_BAK) < 0) then
MessageBox ("Unable to save " + UNINSTALL_BAK + ".", SEVERE);
//else
// MessageBox ("Batch file saved. Backup created.",INFORMATION);
endif;
//DATAsur = "C:\\";
//DATA = SRCDISK^"test";
// TITLE = "Path buffer example";
// PathSet (DATAsur);
//SprintfBox (INFORMATION,TITLE,
// "The starting search path is %s.",DATAsur);
// if (PathAdd(DATA, "", FULL, BEFORE) < 0) then
// MessageBox ("Unable to add DATA Path to path buffer.", SEVERE);
// abort;
// endif;
// PathGet (DATAsur);
//SprintfBox (INFORMATION,TITLE,
// "DATA Path added before first path.\n\nThe search path is %s.",
// DATAsur);
TARG = INSTALLDIR^"Database";
// SOURCE = SRCDISK^"test";

// LaunchAppAndWait(SRCDIR^"path.bat",SOURCE,WAIT);
if (LaunchAppAndWait(INSTALLDIR^"Database\\deinstall.bat",TARG,LAAW_OPTION_WAIT |
LAAW_OPTION_HIDDEN) < 0) then
MessageBox ("Unable to launch deinstall.bat",SEVERE);
endif;
end;

 
下一篇: 解决卸载时残留目标文件夹的问题

时间: 2024-08-03 01:29:05

IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权的相关文章

IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权

原文:IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权 上一篇: MyEclipse中消除frame引起的"the file XXX can not be found.Please check the location and try again."的错误 本文经原作者特许授权于海洋女神发布,转载请务必注明出处与链接:原作者和海洋女神保留对该文的一切法律许可下的权益:需要发布在盈利性报刊.网站等请与原作者或海洋女神联系.序言 这份文档并非本人所写,而是一位朋友在最近做

用inno Setup制作web项目安装包

原文:用inno Setup制作web项目安装包 用inno Setup制作安装包 新建一个文件夹exambody,放apache-tomcat-6.0.33.mysql-5.1.37-win32.java(注:jdk)和图标exambody.ico   1.       批处理安装mysql服务: 在mysql-5.1.37-win32\bin 的目录下: 新建一个文件:启动服务.bat 里面写: cd /d %~dp0                                     

用Inno Setup制作WEB程序安装包

原文 用Inno Setup制作WEB程序安装包 最近做了一个WEB程序的安装包,我把制作的过程做个介绍,贴出源码给大家做个参考 看看inno 的脚本     [Setup] AppCopyright=test AppName=test AppVerName=test v2.0 SolidCompression=true OutputDir=Output\ OutputBaseFilename=test_setup DefaultDirName={pf}\Lms DefaultGroupName

制作iis自动安装包

原文:制作iis自动安装包 MS 一直没有提供可独立安装的 IIS 安装包,Windows 的缺省安装没有安装它,通常要到控制面板的"添加/删除 Windows 程序"中去选择安装.对于熟悉 Windows 安装的人来说这没有问题,但对于要独立发行的软件包却可能是一个问题,并非所有最终用户都熟悉如何去安装 IIS.各大网站都有不同版本的 iis 安装包可下载,可下载回来你仍然找不到其中有可以执行的安装程序.通过在网上查询,得出自己制作 IIS 一键安装的方法如下: 1. 根据使用的 W

NSIS:制作软件升级安装包

原文 NSIS:制作软件升级安装包 相信不是每个人写的软件都只发布一次就可以了,肯定要有修改和维护的情况发生.在这种情况下,您可能就需要一个软件的升级安装包了.   现在,我们就来一步步把这个安装包做出来.   前提:用户已经使用我们的完整安装包安装过了,且已经在注册表中记录了安装路径.   1 ;在注册表中写入安装路径 2 WriteRegStr HKCU "Software\轻狂的软件" "" $INSTDIR   我们要实现以下功能: 1.运行时检测注册表中是

Advanced Installer 制作.NetWeb部署安装包

原文:Advanced Installer 制作.NetWeb部署安装包 因为是.Net的Web应用程序,所以想用Advanced Installer 调用Dll实现安装部署. 因为我需要自己定制参数,包括数据库服务器和数据库名称等,我需要建立一个企业版的项目工程.  建立完毕,产品参数设置好了之后,就转到[用户界面]->[对话框]. 在[首次安装]目录下新建一个对话框:   [图1.1] 编辑对话框,如[图1.1],我在这里将数据库服务器文本框属性名设置为:DBSERVERNAME    如[

VS2010制作C#程序安装包问题……

问题描述 我按网上教程一步步去做了,也生成了setup.exe和Setup.msi,但是一安装就会出现错误,说是拒绝访问msi文件,而且我生成安装包的VS项目所添加的程序集有很多下面都加了一条红线,还有原本教程是说选择"从与我应用程序相同的位置下载系统必备组件",但一生成解决方案就会出现很多错误,说是不能选择此项,只能是"从组件供应商的网站上下载系统必备组件",然后我就改成了后面一项,我不知是哪里出了问题,求各位大神帮忙看看,我是新手,我分已经不多了,最近为做这个程

C#进阶系列——使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)

原文:C#进阶系列--使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll) 前言:上篇C#进阶系列--使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)介绍了下使用Advanced Installer配置IIS和Web.config的过程,操作起来是相对比较简单的,只要知道了博主提供的方法,相信都不是问题,其实博主当初寻找相关方法配置IIS和Web.config的时候也是费了九牛二虎之力的,毕竟资料太少,只能

使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)

原文:使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll) 前言:上篇使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)介绍了下使用Advanced Installer配置IIS和Web.config的过程,操作起来是相对比较简单的,只要知道了博主提供的方法,相信都不是问题,其实博主当初寻找相关方法配置IIS和Web.config的时候也是费了九牛二虎之力的,毕竟资料太少,只能各种方式挨个尝试一遍,解决问题之