针对Setup Factory 7的备份还原方法,希望对后来安装包制作有些作用。
1 S( D4 F S( ^: ]7 e1 }! l* r# k& q
8 _9 V* {. `! y' p以下转自http://www.localsoft.tw/forum/viewthread.php?tid=2747& @& L/ b! G; r+ Q I# u7 h7 M o
% W1 c0 w: J6 W- M[教學] Setup Factory 7 備份還原方法
+ y9 `3 Z+ s( H, gSetup Factory 7 可以設定在安裝時遇到要被覆蓋的檔案時自動將它備份成 .bak 的檔案並存放在與原始檔案相同的資料夾中。例如有下列三個檔案會被覆蓋:
# w! v! Q3 \! @0 B; F- q; r I0 F$ v. R; s, m n: k Q
abc.exe( i' p9 D' t L
123.txt
$ X+ Y% x: J' b! W. F\source\xyz.dll
& H% W+ \+ R0 f3 ^! V+ c6 o: s! }) e: v3 i! D% e& o
安裝後會被備份成:
: n+ _' f. Y) O5 m& w! u% X4 Q! Y: E* f) G+ L" V
abc.exe.bak% {9 w7 J& _, [, h) X
123.txt.bak |+ z n* g; V- {3 z0 p! M
\source\xyz.dll.bak
~5 F2 R% E2 E4 h7 D7 u+ c- { T4 v+ `$ e
之前做中文化時,使用 Setup Factory 7 製作中文安裝程式,如果在其中加入移除中文化的功能時,會遇到需要將之前備份的檔案一個一個更改回原始檔名的問題。所以每個檔案必須設定一次變更名稱的程式碼,三個就要設定三行,萬一有數十個時就頭大了。
! J, R- ?# ?8 o7 a7 j; L" |" t+ d0 L: F' K
最近發現 Setup Factory 7 提供了一個很好用的處理陣列的迴圈,可以利用來一次處理所有需要改回原檔名的 .bak 備份檔案(甚至可包含子資料夾下的檔案)。這個迴圈是:! o6 x# S E8 l* o/ o2 b
( X" M' B; c- V
1 V1 m0 s; q8 m
6 k( U& ]# ?7 m. b* Y& `For index,value in _array Do m$ `: Q% v$ h5 T
.....& {5 `4 C) j( {* Q; O- Q
End
" |- A2 G# S8 N. o e/ T: T5 k) s- q) Y6 S
6 y* p: F. H# g8 G4 _$ _- \
( n$ }% K3 Y- \9 j7 j其中的 index 及 value 可以是隨便的自訂文字,如 i,v。index 是陣列中每個元素的索引;value 是陣列中每個元素的內容。_array 則要被處理的陣列 (一個用其他方法取得的變數陣列)。
! `0 q# x1 h% K. T! W3 D; ^
: N% t5 Q1 B, e1 X3 y3 J範例:
) k; q; I1 t8 |6 P6 j* U+ G8 j4 I$ L
" S$ G6 B7 {1 |; T+ a- w4 @- M
8 ]0 m3 ]2 W! @+ g, w6 |bak_result = File.Find(SessionVar.Expand("%AppFolder%"), "*.bak", true, false, nil, nil);
9 t; i1 v" G- a' r0 u, O, }for i,v in bak_result do( ?9 }$ d* T* y1 u
File.Rename(v, String.TrimRight(v, ".bak"));/ N, T4 \' E" o' ]; Q: q1 `
end
5 c, L" R6 N: H; i" T3 K: E0 G4 t$ @6 n
+ h1 j) A7 Q' ^' k& o- L* V; o$ d
8 ^/ n, \/ M; x2 L3 V# v: l第一行,先用 File.Find 從安裝資料夾 %AppFolder% 中搜尋所有 .bak 的檔案(包含子資料夾),並將所有找到的檔案陣列存入 bak_result 這個變數。由於 %AppFolder% 是一個內建的變數,Setup Factory 7 中的所有內建變數必須使用 SessionVar.Expand() 將內建變數展開才能讀取內容。
( q. J" i$ V1 S! Q5 v( K第二行,利用這次說明的陣列處理迴圈來處理,它會一個一個取出存在 bak_result 中的變數。將索引存入 i;內容存入 v。2 X& M1 [/ V, B. ^# V/ t1 M5 V0 U
第三行,利用 String.TrimRight 將每個檔案名稱後面的 .bak 字串刪掉,並利用 File.Rename 將變數中的檔案名稱重新命名為不含 .bak 字串的檔案名稱。由於我們只是要處理每個陣列元素的內容 v,用不到索引,所以索引 i 在這行程式中並未出現。
% e) ~6 g" n: i ]第四行,結束迴圈。
9 B5 B: I1 g4 e' m: R: b6 i5 ~- A( z4 G4 Y4 P2 _- C# b
由於 File.Find 找到的 .bak 檔案,會包含他的路徑及檔案名稱,因此你只要設定讓 File.Find 同時去找子資料夾下的檔案,在後續更名的過程中它也會一併將子資料夾下的 .bak 檔案也回復成原來的檔案。+ ^- {5 }+ b, B$ j$ d$ ]
; \! j2 K+ `4 g0 \: l) B如此一來,不管你的移除對象有數十個或上百個以上的 .bak,只要上面那四行程式碼,一次全可搞定。 |