上一篇: 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;
下一篇: 解决卸载时残留目标文件夹的问题