针对Setup Factory 7的备份还原方法,希望对后来安装包制作有些作用。/ O; V6 e& S( c( j5 w1 F* o
3 W8 n( f6 ~3 D: v( V4 t' g
以下转自http://www.localsoft.tw/forum/viewthread.php?tid=2747
2 q5 {$ r6 u3 C: n. N
3 W, a1 X" D4 C& F1 Y# ]+ Y, G7 @' \[教學] Setup Factory 7 備份還原方法
3 M$ A% r( l/ o2 a, \& l1 ?/ nSetup Factory 7 可以設定在安裝時遇到要被覆蓋的檔案時自動將它備份成 .bak 的檔案並存放在與原始檔案相同的資料夾中。例如有下列三個檔案會被覆蓋:
' \& ?0 Z6 y6 h% b
! D3 N# R# `2 R! cabc.exe8 o2 S7 h W2 p) g6 _
123.txt
) r4 ^5 u) _- Z0 `2 K3 k, ~. q\source\xyz.dll
2 u% l8 u X) v7 V: e- O0 D
! E" g8 ]7 b- {3 a% I& f1 t安裝後會被備份成:
1 @5 f( Z# W3 r9 U T
1 h% x9 `2 v4 A5 K7 ^, g Eabc.exe.bak/ F, C V4 i5 p2 l: i7 |/ N
123.txt.bak
4 h0 p2 @- F1 K* C\source\xyz.dll.bak' l" W% s4 z. Y
5 r& P* b$ T, V- c之前做中文化時,使用 Setup Factory 7 製作中文安裝程式,如果在其中加入移除中文化的功能時,會遇到需要將之前備份的檔案一個一個更改回原始檔名的問題。所以每個檔案必須設定一次變更名稱的程式碼,三個就要設定三行,萬一有數十個時就頭大了。$ N6 i8 [& t1 s1 M' O
' V* c/ h1 h, I, S0 |- M9 L
最近發現 Setup Factory 7 提供了一個很好用的處理陣列的迴圈,可以利用來一次處理所有需要改回原檔名的 .bak 備份檔案(甚至可包含子資料夾下的檔案)。這個迴圈是:% D4 Z# K$ }6 J9 W0 ~+ e; ~6 \
% k- g4 n# b& s& M- o/ e& |
- ^2 L) L8 v7 O: U
7 }1 Q, b* {1 K% a- H- F* T3 k/ FFor index,value in _array Do& A& l2 g! ^* m' V
....., ^) \( `0 p7 s) r) e: U/ c
End 9 B: F& z3 V) u
5 r! O8 `! g" W; l* `; C& L/ I
, G) j- F' z M! h. O
# l7 Q( v8 e% `6 a, s其中的 index 及 value 可以是隨便的自訂文字,如 i,v。index 是陣列中每個元素的索引;value 是陣列中每個元素的內容。_array 則要被處理的陣列 (一個用其他方法取得的變數陣列)。
; v1 ?/ {* t" B, T& W6 ?: i4 y
F4 b% ~) t$ d$ M2 E. \. h# x範例:
9 c) k" @" O6 I% @ a+ x6 O9 _' `% H# ^. K8 p: _; Z" V/ P" Z
8 w) u- x: y5 `% M
: d2 ^9 Q0 j* W( kbak_result = File.Find(SessionVar.Expand("%AppFolder%"), "*.bak", true, false, nil, nil);5 ?% D; q) _& l3 ^
for i,v in bak_result do
3 \; N6 H, e) r0 s- S5 q. Y File.Rename(v, String.TrimRight(v, ".bak"));# ?+ A$ j; u- z, Z9 q8 B
end 2 ~" d' L; `! e% K
. }- b" Y( l; j) _# J. g, l1 v$ A: _3 k' V; l# x1 `8 i* u
4 a4 H& L2 z4 q# H! r) F第一行,先用 File.Find 從安裝資料夾 %AppFolder% 中搜尋所有 .bak 的檔案(包含子資料夾),並將所有找到的檔案陣列存入 bak_result 這個變數。由於 %AppFolder% 是一個內建的變數,Setup Factory 7 中的所有內建變數必須使用 SessionVar.Expand() 將內建變數展開才能讀取內容。
9 D9 o- X1 Y- k+ H% \- z第二行,利用這次說明的陣列處理迴圈來處理,它會一個一個取出存在 bak_result 中的變數。將索引存入 i;內容存入 v。
: b9 i3 X7 g; o& y5 b* t' [# c第三行,利用 String.TrimRight 將每個檔案名稱後面的 .bak 字串刪掉,並利用 File.Rename 將變數中的檔案名稱重新命名為不含 .bak 字串的檔案名稱。由於我們只是要處理每個陣列元素的內容 v,用不到索引,所以索引 i 在這行程式中並未出現。9 }/ ^; l: m( R2 c0 E. t
第四行,結束迴圈。
% A3 Z8 l. w( l
5 }! e5 v6 a0 w0 Q- C' V9 Y( b由於 File.Find 找到的 .bak 檔案,會包含他的路徑及檔案名稱,因此你只要設定讓 File.Find 同時去找子資料夾下的檔案,在後續更名的過程中它也會一併將子資料夾下的 .bak 檔案也回復成原來的檔案。% J4 ` K% }7 @0 u- K" p
9 a# [ p4 `4 _9 l' c* Z; h r如此一來,不管你的移除對象有數十個或上百個以上的 .bak,只要上面那四行程式碼,一次全可搞定。 |