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

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

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

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

第三部分:使用IS2009
向导设置
1. 打开 InstallShield2009,新建一个Installscript MSI Project,建议选择此工程,因为该工
程支持脚本编写。选择类型为Windows Installer > InstallScript MSI Projcet
IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权

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

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

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

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

 

 

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

 

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

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

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

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

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

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

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

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

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

 

 

 

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


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

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

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

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

以上步骤完成了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 批处理脚本复制到本地硬盘,
只有在成功复制之后,我们才能调用该批处理脚本,使用这些函数。
如图所示:
IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权

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 的安装路径即可。
IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权

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;
脚本已经完成,我们编译脚本,并确定没有任何的问题。
IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权

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

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

 

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

 

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

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

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

 

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

完整的安装包文件

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

第六部分:遇到的问题
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;

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

IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权,布布扣,bubuko.com

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

上一篇:mysql 触发器


下一篇:MongoDB配置多个ConfigDB的问题(笔记)