针对Setup Factory 7的备份还原方法,希望对后来安装包制作有些作用。
8 j- P( `1 V! I; C A$ I& u5 [6 w9 ^$ o* I2 z
以下转自http://www.localsoft.tw/forum/viewthread.php?tid=2747
6 o% M" H" D: I' {8 }* T4 g# i; Q* O5 @/ L, u4 O# D
[教學] Setup Factory 7 備份還原方法- F# ~0 O! o/ G4 G
Setup Factory 7 可以設定在安裝時遇到要被覆蓋的檔案時自動將它備份成 .bak 的檔案並存放在與原始檔案相同的資料夾中。例如有下列三個檔案會被覆蓋:# `5 u9 ?" e8 O' [# z4 o: ?
. p" b ^- O; l% C$ P4 W
abc.exe @: `, `: P$ I+ ~% q F! M
123.txt
! {% Y! |* t1 Z1 Q\source\xyz.dll
, V+ ~6 I! D2 C4 T
+ d6 w: i* y8 M1 \6 r安裝後會被備份成:# v. m+ R, z3 l. G3 j
) m4 A6 u" e$ B7 b6 [ @8 V
abc.exe.bak$ h5 G6 L1 i# z5 g+ {
123.txt.bak8 g. [/ E8 v# M& y* O( f
\source\xyz.dll.bak; u2 y6 p! q. {$ f* A+ s: i8 f
: M2 H; e( ` a) v1 I之前做中文化時,使用 Setup Factory 7 製作中文安裝程式,如果在其中加入移除中文化的功能時,會遇到需要將之前備份的檔案一個一個更改回原始檔名的問題。所以每個檔案必須設定一次變更名稱的程式碼,三個就要設定三行,萬一有數十個時就頭大了。$ E: k T) U, B& w: Z
2 }9 {5 @7 F6 H最近發現 Setup Factory 7 提供了一個很好用的處理陣列的迴圈,可以利用來一次處理所有需要改回原檔名的 .bak 備份檔案(甚至可包含子資料夾下的檔案)。這個迴圈是:
$ ?/ t5 _- z5 R& `% u
3 `% Z5 E* f- A' N7 ~
! S1 I& [' \+ g) [0 W/ Y0 Y# M# x% l
For index,value in _array Do. j, A# ^& u: D4 L
.....3 w4 w: V6 @0 v
End
- q9 G/ F- W, d1 z
; k3 z" Y+ Z' @. a5 n5 s3 X7 [+ a& k# f, t" M; A
+ m$ l, l; P6 N* j& x! F+ V; I0 c5 ]
其中的 index 及 value 可以是隨便的自訂文字,如 i,v。index 是陣列中每個元素的索引;value 是陣列中每個元素的內容。_array 則要被處理的陣列 (一個用其他方法取得的變數陣列)。
, y7 l$ S0 n) w0 }3 A) n
! w% z. D5 W, p範例:+ G# H$ t* ^: G
6 M3 ?1 e% E& q" q6 u" D
7 S8 V) A, n/ _- d @
9 _& p+ p. j, ubak_result = File.Find(SessionVar.Expand("%AppFolder%"), "*.bak", true, false, nil, nil);. V3 Q. D" f% R0 }; y
for i,v in bak_result do# S6 w6 @; w0 |2 N7 W6 S5 H" O: G- x
File.Rename(v, String.TrimRight(v, ".bak"));* G! h6 {( s+ x: \$ c
end ; r x w: _+ C% P% l f
+ ?% ~% {; N. P U+ J# _7 Z; \
' ^# h9 [! q4 U% x& `
$ B8 F& [. M! a4 \9 s y0 Y m
第一行,先用 File.Find 從安裝資料夾 %AppFolder% 中搜尋所有 .bak 的檔案(包含子資料夾),並將所有找到的檔案陣列存入 bak_result 這個變數。由於 %AppFolder% 是一個內建的變數,Setup Factory 7 中的所有內建變數必須使用 SessionVar.Expand() 將內建變數展開才能讀取內容。
s3 Y, p ]% c( ?% {1 g第二行,利用這次說明的陣列處理迴圈來處理,它會一個一個取出存在 bak_result 中的變數。將索引存入 i;內容存入 v。
* B, R) @; l4 W. U第三行,利用 String.TrimRight 將每個檔案名稱後面的 .bak 字串刪掉,並利用 File.Rename 將變數中的檔案名稱重新命名為不含 .bak 字串的檔案名稱。由於我們只是要處理每個陣列元素的內容 v,用不到索引,所以索引 i 在這行程式中並未出現。+ {# i' B4 u6 I
第四行,結束迴圈。
! y7 r* L; i3 G
9 ^' u2 t3 b& s# [7 a+ Q由於 File.Find 找到的 .bak 檔案,會包含他的路徑及檔案名稱,因此你只要設定讓 File.Find 同時去找子資料夾下的檔案,在後續更名的過程中它也會一併將子資料夾下的 .bak 檔案也回復成原來的檔案。8 U2 \* A. }0 l* B6 R/ S2 D
1 M8 ^9 v$ F; b" s0 Z Z
如此一來,不管你的移除對象有數十個或上百個以上的 .bak,只要上面那四行程式碼,一次全可搞定。 |