针对Setup Factory 7的备份还原方法,希望对后来安装包制作有些作用。
# R# k& \; m8 M0 ~, F9 p) t9 u T& N% n! o h, U. }6 E" N& k
以下转自http://www.localsoft.tw/forum/viewthread.php?tid=2747
' K. U3 w" q1 K" O+ u, ]4 g" q! p* @7 C5 a2 V) \/ y/ J4 K' Q. _$ i
[教學] Setup Factory 7 備份還原方法
" ~4 m# j' T" G9 H2 `Setup Factory 7 可以設定在安裝時遇到要被覆蓋的檔案時自動將它備份成 .bak 的檔案並存放在與原始檔案相同的資料夾中。例如有下列三個檔案會被覆蓋:
3 i \8 s7 E3 M1 i* M% a- m3 S$ `9 A+ g1 s5 Y [
abc.exe
: j" k! ^3 e3 {0 u( ?% b7 T123.txt
2 G$ L$ w/ q# C; A' L\source\xyz.dll
# ]+ [) Q( _, R8 D4 a2 ~; m: M4 x' p+ c/ @3 R3 |) k. c
安裝後會被備份成: i+ D' K( H( K/ V1 J9 H7 U
7 a7 Z3 G) W) B1 [# b1 d8 I' Yabc.exe.bak& C& `% V* Z& ?6 Y
123.txt.bak- O: d5 f9 B) Q6 ? U" r/ {
\source\xyz.dll.bak: d' u [2 t' U) C9 Y
! F& v5 J% `% a之前做中文化時,使用 Setup Factory 7 製作中文安裝程式,如果在其中加入移除中文化的功能時,會遇到需要將之前備份的檔案一個一個更改回原始檔名的問題。所以每個檔案必須設定一次變更名稱的程式碼,三個就要設定三行,萬一有數十個時就頭大了。% V0 ~& u# e& P& P ]# g
# {" ^( e x8 X/ I最近發現 Setup Factory 7 提供了一個很好用的處理陣列的迴圈,可以利用來一次處理所有需要改回原檔名的 .bak 備份檔案(甚至可包含子資料夾下的檔案)。這個迴圈是:* A3 x- t7 P" Q+ y1 J
V2 c5 I, w2 h; Z. l! D! W8 i
& [; u3 f0 A: ~' E4 I/ N
: v5 g% Z1 W0 R2 g8 _For index,value in _array Do5 m( r2 m6 l; j, @6 K2 U* ?
.....
. x- T( |& Y; I+ |End
# B$ n7 Z- J" v
( V z$ f8 g; h' N" y; f; K4 I6 a9 [+ O/ Q5 V
* j* I5 x" f/ C+ {
其中的 index 及 value 可以是隨便的自訂文字,如 i,v。index 是陣列中每個元素的索引;value 是陣列中每個元素的內容。_array 則要被處理的陣列 (一個用其他方法取得的變數陣列)。
z& M+ A0 G r! w3 ?; F/ `1 D! F# l5 Y4 |& _
範例:
[2 d2 @3 v9 l# ]9 k( g; P4 ]% ~8 M/ z3 q( u7 k' w
5 e7 M d" J# I! f+ {! b& h* n
: A8 C: g! y* o& Y# z
bak_result = File.Find(SessionVar.Expand("%AppFolder%"), "*.bak", true, false, nil, nil);
, Y$ L* B* ^# ] b' qfor i,v in bak_result do
G# G% o G$ M. R B* u File.Rename(v, String.TrimRight(v, ".bak"));" z% Y. x5 F! q; [
end
# w+ w; w2 A( E- a+ r, Q/ N2 K: x
~1 y8 g3 }6 p7 L4 S+ g$ t
' k5 Y$ q3 m" i# _
第一行,先用 File.Find 從安裝資料夾 %AppFolder% 中搜尋所有 .bak 的檔案(包含子資料夾),並將所有找到的檔案陣列存入 bak_result 這個變數。由於 %AppFolder% 是一個內建的變數,Setup Factory 7 中的所有內建變數必須使用 SessionVar.Expand() 將內建變數展開才能讀取內容。/ g* F) \' Z, X- s' C& s7 N4 b
第二行,利用這次說明的陣列處理迴圈來處理,它會一個一個取出存在 bak_result 中的變數。將索引存入 i;內容存入 v。4 Y5 t( {) c% u: w3 X& T) Q
第三行,利用 String.TrimRight 將每個檔案名稱後面的 .bak 字串刪掉,並利用 File.Rename 將變數中的檔案名稱重新命名為不含 .bak 字串的檔案名稱。由於我們只是要處理每個陣列元素的內容 v,用不到索引,所以索引 i 在這行程式中並未出現。
4 D5 J. W4 r/ S$ }2 @; y! i- e+ e第四行,結束迴圈。
0 Z2 p# ~ k) X* g* J& S4 ?
" w: {9 }" O: G3 L由於 File.Find 找到的 .bak 檔案,會包含他的路徑及檔案名稱,因此你只要設定讓 File.Find 同時去找子資料夾下的檔案,在後續更名的過程中它也會一併將子資料夾下的 .bak 檔案也回復成原來的檔案。
' V8 B5 o1 Y8 o& V
1 h7 g) z0 s& E- Y0 c$ z如此一來,不管你的移除對象有數十個或上百個以上的 .bak,只要上面那四行程式碼,一次全可搞定。 |