杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2918|回复: 0

InstallShield 2009 制作 Oracle 静默安装包

[复制链接]
发表于 2015-2-6 13:55:26 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
源址:IS2009制作Oracle 静默安装包

第一部分:前言
目标需求
实现 ESL——嵌入式软件许可
在安装过程中,需要安装我们的软件产品,并且安装Oracle 数据库。安装数据库之后
需要导入基础数据,创建指定的库,创建用户和表空间。在安装Oracle 数据时,必须实现
静默安装,不能出现GUI 界面,也不能暴露出安装参数。所有安装过程一次完成,无需用
户干预。
环境说明
操作系统——Windows XP SP3
安装工具——InstallShield 2009 — Premier Edition
数据库——Oracle 10G-R2
第二部分:配置Oracle
此过程需要对Oracle 进行相关的配置,包括录制Response 文件、制作带数据的模板、
调整安装脚本、解锁用户脚本,设置环境变量等操作。
录制 response文件
1. 运行CMD,在命令行窗口进入Oracle 所在路径,这里路径为D:Oracdatabase,
Oracle10gserver.rsp是要保存的文件名。
image_thumb.png
2. 运行此命令后,Oracle安装界面被打开。
3. 去掉创建启动数据库
4. 在汇总信息出现时,退出安装界面,不进行安装。


5. 此时发现在D:Oracdatabase 目录中出现了Oracle10gserver.rsp 文件,说明录制成功。该
文件存放的路径,我们后续将会在Install.bat中用到。
创建用户、表空间、导入基础数据
1. 在已有的同版本数据库中创建用户、表空间、导入基础数据
2. 使用 SQL系统账号登陆,并执行CreateDB.sql脚本。注意:脚本中的路径应该以实际的
数据路径为准。
3. 导入文件zgisexp.dmp 和zproexp.dmp。把此脚本存为CMD 文件,直接执行即可。
注意:脚本中的路径应该为实际dmp 文件存放的路径。另外此脚本为本单位的数据信息,
可不作为参考!
image_thumb_3.png
创建用户、表空间脚本:

制作带基础数据的模板
有了以上的数据,我们就开始制作数据的模板,以便建库的时候使用。
1. 创建数据库模板

2. 创建好后,我们会在assistantsdbca        emplates目录中,发现如下两个模板
文件。temp_10g.dbc temp_10.dfb
此处两个文件的作用是,按照数据库模板的形式创建数据库,无需在导入表,创建
用户和导入基础数据。这一步,先在已有的Oracle环境下完成。我们拷贝这两个文
件即可。
3. 修改temp_10g.dbc
image_thumb_7.png

安装脚本描述
在进行Oracle安装过程中,需要安装程序调用以下的脚本,以实现Oracle的安装过程。
1. Install.cmd 安装Oracle软件脚本
执行此脚本时,需要带以上的参数,具体参数后边会有说明。
image_thumb_8.png
2. copynetca.cmd 拷贝监听文件和模板文件,并创建监听服务脚本。
Ø 脚本中存在两个接收的变量,这个是从IS 中传出来的路径参数,必须存在。另外,模
板文件必须拷贝到指定的路径下,assistantsdbca        emplates。
3. createDB.cmd 创建带模板数据的数据库脚本。
此脚本用于根据数据模板创建数据库,命令带如下的参数:
image_thumb_10.png

4. unlock.bat 用户解锁脚本
安装模板生成的数据库,其用户状态为锁定,需要执行解锁脚本。

其中change.sql为:
集合Oracle安装脚本
以上的4 个脚本是安装过程必备的4 个脚本,我们现在整理为一个批处理文件install.bat,
以便我们在制作安装包的时候调用该批处理。根据上述脚本的参数类型,我们把参数补完整。

Ø 脚本中存在一个接收的环境变量%DATABASEDIR%,这是由IS运行此程序带出来的参
数,此参数为安装的目标路径。
Ø %SOURPATH%这个参数虽然没有在BAT 文件中有任何的接收说明,但是在执行安装
过程中,IS会创建该参数在BAT文件头端,该参数为目标源路径地址。如何在IS中自
动创建该变量,在第三部份中说明。
Ø 以上的脚本分别调用了上边的4 个脚本,他们后边均带有参数。

Ok,现在已经完成了Oracle方面的设置,我们需要保留的文件为1+4个批处理文件、1 个.SQL
文件和两个模板文件。这些文件将会在IS或安装中被调用。
卸载脚本描述
1. deinstall.cmd 卸载oracle软件,该脚本的参数如下:
image_thumb_15.png
2. completeClean.cmd 清除相关文件和设置,该脚本的相关参数如下:
集合卸载脚本
Ø 以上两个脚本为卸载数据库所用,我们把他集合为一个批处理,以方便IS调用。
Ø 该脚本中依然存在%DATABASEDIR%和%SOURPATH%两个参数。作用同install.bat

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

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

image_thumb_1.png

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

image_thumb_2.png

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


image_thumb_3.png

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

image_thumb_4.png

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

image_thumb_5.png

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

image_thumb_6.png

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

image_thumb_7.png


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

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

image_thumb_8.png

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

image_thumb_9.png

以上步骤完成了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. 在脚本框的上方,下拉选择框,选择Files3. 之后,选择右边的下拉框,选择Installed之所以选择Installed,是因为安装过程中会把Install.bat 批处理脚本复制到本地硬盘,只有在成功复制之后,我们才能调用该批处理脚本,使用这些函数。如图所示:

image_thumb_10.png

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

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

  12. endif;
  13. DBPATH = SRCDISK + "";
  14. // Add the line SET PATH = SRCDISK+"\”.
  15. if (BatchAdd ("SOURPATH", DBPATH, "", BEFORE) < 0) then
  16. MessageBox ("Second call to BatchAdd failed", WARNING);
  17. abort;
  18. endif;
  19. // Save the updated file; back up the original file.
  20. if (BatchFileSave(EXAMPLE_BAK) < 0) then
  21. MessageBox ("Unable to save " + EXAMPLE_BAK + ".", SEVERE);
  22. //else
  23. // MessageBox ("Batch file saved. Backup created.",INFORMATION);
  24. endif;
复制代码

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

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

  1. #define UNINSTALL_BAT INSTALLDIR^"Database\deinstall.bat"
  2. #define UNINSTALL_BAK "deinstall.bak"
  3. export prototype DefaultFeature_UnInstalling();
  4. function DefaultFeature_UnInstalling()
  5. STRING TARG,SOURCE;
  6. STRING DBPATH,DATA,DATAsur,TITLE;
  7. begin
  8. // Load the batch file to be edited.
  9. if (BatchFileLoad (UNINSTALL_BAT) < 0) then
  10. MessageBox ("Unable to load " + EXAMPLE_BAT+".", SEVERE);
  11. abort;
  12. endif;
  13. DBPATH = SRCDISK + "";
  14. // Add the line SET PATH = SRCDISK+"".
  15. if (BatchAdd ("SOURPATH", DBPATH, "", BEFORE) < 0) then
  16. MessageBox ("Second call to BatchAdd failed", WARNING);
  17. abort;
  18. endif;
  19. // Save the updated file; back up the original file.
  20. if (BatchFileSave(UNINSTALL_BAK) < 0) then
  21. MessageBox ("Unable to save " + UNINSTALL_BAK + ".", SEVERE);

  22. //else
  23. // MessageBox ("Batch file saved. Backup created.",INFORMATION);
  24. endif;
复制代码

执行批处理文件我们修改完批处理文件,就要在修改保存之后执行它。这需要用到Is 函数库中的LaunchAppAndWait()函数语法:LaunchAppAndWait (szProgram, szCmdLine, lWait);说明:LaunchAppAndWait函数运行由szProgram指定的带有szCmdLine指定的命令行参数的应用程序。第三个参数,lWait 指示安装在继续前是否要等待直到运行的应用程序终止。一个安装程序只能监控由szProgram 指定的应用程序;如果该应用程序要运行其它应用程序或进程,安装程序不能监控它们。因此,安装程序将在第一个应用程序结束后继续,即使那时由第一个应用程序运行的其它应用程序仍在运行。注意如果运行的应用程序终止失败,则安装程序将无限等待运行的应用程序完成。添加在Installed脚本的后面:

  1. TARG = INSTALLDIR^"Database";
  2. if (LaunchAppAndWait(INSTALLDIR^"Database\install.bat",TARG,LAAW_OPTION_WAIT |
  3. LAAW_OPTION_HIDDEN) < 0) then
  4. MessageBox ("Unable to launch install.bat",SEVERE);
  5. endif;
  6. end;
复制代码

LAAW_OPTION_HIDDEN 这个参数是隐藏bat 的执行窗口, 它与LAAW_OPTION_WAIT并用是隐藏并且等待程序执行完成后返回,注意他们的前后顺序。添加在UnInstalling脚本的后面:

  1. TARG = INSTALLDIR^"Database";
  2. if
  3. (LaunchAppAndWait(INSTALLDIR^"Database\deinstall.bat",TARG,LAAW_OPTION_WAIT |
  4. LAAW_OPTION_HIDDEN) < 0) then
  5. MessageBox ("Unable to launch deinstall.bat",SEVERE);
  6. endif;
  7. end;
  8. 脚本已经
复制代码

脚本已经完成,我们编译脚本,并确定没有任何的问题。

image_thumb_12.png

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

image_thumb_13.png

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


image_thumb_14.png

image_thumb_15.png

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


image_thumb_16.png

完整的安装包文件

image_thumb_17.png

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


部分源代码

  1. export prototype New_Feature_Installing();
  2. function New_Feature_Installing()
  3. begin
  4. end;
  5. //---------------------------------------------------------------------------
  6. // The Installing event is sent before the feature DefaultFeature
  7. // is installed.
  8. //---------------------------------------------------------------------------
  9. export prototype DefaultFeature_Installing();
  10. function DefaultFeature_Installing()
  11. STRING diskpath,szCommand,szCmdLine,szCommandecp,szCmdLineecp;
  12. begin
  13. diskpath = SRCDISK + ""; //定义安装盘路径
  14. //运行framework20安装程序
  15. if (LaunchAppAndWait(SRCDIR^"supportfiles\dotnetfx.exe","",LAAW_OPTION_WAIT/* |
  16. LAAW_OPTION_HIDDEN*/) < 0) then
  17. MessageBox ("Unable to launch dotnet",SEVERE);
  18. endif;
  19. if
  20. (LaunchAppAndWait(SRCDIR^"supportfiles\framwork2.0\setup.exe","",LAAW_OPTION_WAIT/*
  21. |
  22. LAAW_OPTION_HIDDEN*/) < 0) then
  23. MessageBox ("Unable to launch dotnet2",SEVERE);
  24. endif;
  25. //定义MSI文件参数及MSI文件位置
  26. szCommand = WINSYSDIR^"msiexec.exe";
  27. LongPathToShortPath(szCommand);
  28. szCmdLine =SRCDIR^"supportfiles\EngineRT\setup.msi";
  29. LongPathToShortPath(szCmdLine);
  30. //运行MSI文件
  31. if (LaunchAppAndWait( szCommand,"/i"+szCmdLine,LAAW_OPTION_WAIT) < 0) then
  32. MessageBox ("Unable to launch ACGIS",SEVERE);
  33. endif;
  34. // szCommandecp = SRCDIR^"supportfiles\SoftwareAuthorization.exe";
  35. // LongPathToShortPath(szCommandecp);
  36. // szCmdLineecp =SRCDIR^"supportfiles\license.ecp";
  37. // LongPathToShortPath(szCmdLineecp);
  38. if (LaunchAppAndWait(SRCDIR^"supportfiles\Runecp.bat",diskpath,LAAW_OPTION_WAIT/*
  39. |
  40. LAAW_OPTION_HIDDEN*/) < 0) then
  41. MessageBox ("Unable to launch ecp",SEVERE);
  42. endif;
  43. end;
  44. //---------------------------------------------------------------------------
  45. // The Installed event is sent after the feature DefaultFeature
  46. // is installed.
  47. //---------------------------------------------------------------------------
  48. #define EXAMPLE_BAT INSTALLDIR^"Database\install.bat"
  49. #define EXAMPLE_BAK "install.bak"
  50. export prototype DefaultFeature_Installed();
  51. function DefaultFeature_Installed()
  52. STRING TARG,SOURCE,TARG1;
  53. STRING DBPATH,DATA,DATAsur,TITLE;
  54. begin
  55. // Load the batch file to be edited.
  56. if (BatchFileLoad (EXAMPLE_BAT) < 0) then
  57. MessageBox ("Unable to load " + EXAMPLE_BAT+".", SEVERE);
  58. abort;
  59. endif;
  60. DBPATH = SRCDISK + "";
  61. // Add the line SET PATH = SRCDISK^"test".
  62. if (BatchAdd ("SOURPATH", DBPATH, "", BEFORE) < 0) then
  63. MessageBox ("Second call to BatchAdd failed", WARNING);
  64. abort;
  65. endif;
  66. // Save the updated file; back up the original file.
  67. if (BatchFileSave(EXAMPLE_BAK) < 0) then
  68. MessageBox ("Unable to save " + EXAMPLE_BAK + ".", SEVERE);
  69. //else
  70. // MessageBox ("Batch file saved. Backup created.",INFORMATION);
  71. endif;
  72. //DATAsur = "C:";
  73. //DATA = SRCDISK^"test";
  74. // TITLE = "Path buffer example";
  75. // PathSet (DATAsur);
  76. //SprintfBox (INFORMATION,TITLE,
  77. // "The starting search path is %s.",DATAsur);
  78. // if (PathAdd(DATA, "", FULL, BEFORE) < 0) then
  79. // MessageBox ("Unable to add DATA Path to path buffer.", SEVERE);
  80. // abort;
  81. // endif;
  82. // PathGet (DATAsur);
  83. //SprintfBox (INFORMATION,TITLE,
  84. // "DATA Path added before first path.The search path is %s.",
  85. // DATAsur);
  86. TARG = INSTALLDIR^"Database";
  87. // SOURCE = SRCDISK^"test";
  88. // LaunchAppAndWait(SRCDIR^"path.bat",SOURCE,WAIT);
  89. if (LaunchAppAndWait(INSTALLDIR^"Database\install.bat",TARG,LAAW_OPTION_WAIT |
  90. LAAW_OPTION_HIDDEN) < 0) then
  91. MessageBox ("Unable to launch install.bat",SEVERE);
  92. endif;
  93. //Delay(1);
  94. // LaunchAppAndWait(INSTALLDIR^"createdb.bat",TARG,LAAW_OPTION_WAIT);
  95. //Delay(2);
  96. // LaunchAppAndWait(SRCDISK^"test//sqlscript//setup.bat",TARG,LAAW_OPTION_WAIT);
  97. // Delay(2);
  98. // LaunchAppAndWait(SRCDISK^"test//sqlscript//importdb.bat",TARG,LAAW_OPTION_WAIT);
  99. end;
  100. //---------------------------------------------------------------------------
  101. // The UnInstalling event is sent just before the feature
  102. // DefaultFeature is uninstalled.
  103. //---------------------------------------------------------------------------
  104. #define UNINSTALL_BAT INSTALLDIR^"Database\deinstall.bat"
  105. #define UNINSTALL_BAK "deinstall.bak"
  106. export prototype DefaultFeature_UnInstalling();
  107. function DefaultFeature_UnInstalling()
  108. STRING TARG,SOURCE;
  109. STRING DBPATH,DATA,DATAsur,TITLE;
  110. begin
  111. // Load the batch file to be edited.
  112. if (BatchFileLoad (UNINSTALL_BAT) < 0) then
  113. MessageBox ("Unable to load " + EXAMPLE_BAT+".", SEVERE);
  114. abort;
  115. endif;
  116. DBPATH = SRCDISK + "";
  117. // Add the line SET PATH = SRCDISK^"test".
  118. if (BatchAdd ("SOURPATH", DBPATH, "", BEFORE) < 0) then
  119. MessageBox ("Second call to BatchAdd failed", WARNING);
  120. abort;
  121. endif;
  122. // Save the updated file; back up the original file.
  123. if (BatchFileSave(UNINSTALL_BAK) < 0) then
  124. MessageBox ("Unable to save " + UNINSTALL_BAK + ".", SEVERE);
  125. //else
  126. // MessageBox ("Batch file saved. Backup created.",INFORMATION);
  127. endif;
  128. //DATAsur = "C:";
  129. //DATA = SRCDISK^"test";
  130. // TITLE = "Path buffer example";
  131. // PathSet (DATAsur);
  132. //SprintfBox (INFORMATION,TITLE,
  133. // "The starting search path is %s.",DATAsur);
  134. // if (PathAdd(DATA, "", FULL, BEFORE) < 0) then
  135. // MessageBox ("Unable to add DATA Path to path buffer.", SEVERE);
  136. // abort;
  137. // endif;
  138. // PathGet (DATAsur);
  139. //SprintfBox (INFORMATION,TITLE,
  140. // "DATA Path added before first path.The search path is %s.",
  141. // DATAsur);
  142. TARG = INSTALLDIR^"Database";
  143. // SOURCE = SRCDISK^"test";
  144. // LaunchAppAndWait(SRCDIR^"path.bat",SOURCE,WAIT);
  145. if (LaunchAppAndWait(INSTALLDIR^"Database\deinstall.bat",TARG,LAAW_OPTION_WAIT |
  146. LAAW_OPTION_HIDDEN) < 0) then
  147. MessageBox ("Unable to launch deinstall.bat",SEVERE);
  148. endif;
  149. end;
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-12 07:33 , Processed in 0.855993 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表