IS2009製作Oracle 靜默安裝包(二) 感謝空白先生特許授權

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   os   io   

原文: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;

 
下一篇: 解決卸載時殘留目標檔案夾的問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.