针对Setup Factory 7的备份还原方法,希望对后来安装包制作有些作用。
* Y. L5 `( |& q9 i. L
0 \3 \( K- H" h" x以下转自http://www.localsoft.tw/forum/viewthread.php?tid=2747 @7 \% ]# d1 Z$ [
% T8 { _) O9 J7 ]7 @[教學] Setup Factory 7 備份還原方法" K) o* q$ z7 Z1 ?; v( I
Setup Factory 7 可以設定在安裝時遇到要被覆蓋的檔案時自動將它備份成 .bak 的檔案並存放在與原始檔案相同的資料夾中。例如有下列三個檔案會被覆蓋:
$ \' w# c, q: c: @9 n4 R- C: D# B; ?, g x" l. P, X$ w
abc.exe0 W& ]9 y5 _) J
123.txt. Z/ c; x- F' C4 g3 j1 z+ f
\source\xyz.dll
% W$ {: O3 U- s0 q+ n
3 E z/ Q( c; u; p; S& e) e* c安裝後會被備份成:4 n# J6 W. f# s5 D
B, G% a+ x5 k. ]7 k; Babc.exe.bak
+ \; r) Q/ k; I: z123.txt.bak
" P' {, I+ J2 N7 L$ @\source\xyz.dll.bak4 w! v% }$ D" t; e
5 R# b$ E3 @0 o# S9 \; b1 r6 N, M之前做中文化時,使用 Setup Factory 7 製作中文安裝程式,如果在其中加入移除中文化的功能時,會遇到需要將之前備份的檔案一個一個更改回原始檔名的問題。所以每個檔案必須設定一次變更名稱的程式碼,三個就要設定三行,萬一有數十個時就頭大了。* s4 F3 H9 e; { |
" ^; l# [+ I! N% k9 o最近發現 Setup Factory 7 提供了一個很好用的處理陣列的迴圈,可以利用來一次處理所有需要改回原檔名的 .bak 備份檔案(甚至可包含子資料夾下的檔案)。這個迴圈是:
7 o2 P6 a' g! b8 D3 l; C7 D
6 y; _! K% D, c! H1 s* N
# V% D0 X% z: u" a% o/ R- V2 {9 K4 K, V# ^
For index,value in _array Do
. [6 a& u5 x w& y1 A. g+ u* u .....
8 M. E( ?1 c, e/ f" @End
- z6 C7 D$ w; {, [9 N6 b+ |. l/ w+ _& R/ F; U1 z4 [% C
. `$ j! Y8 P1 I2 `3 F8 g: \+ R
* K2 _3 {! m% V8 W其中的 index 及 value 可以是隨便的自訂文字,如 i,v。index 是陣列中每個元素的索引;value 是陣列中每個元素的內容。_array 則要被處理的陣列 (一個用其他方法取得的變數陣列)。
% i. I+ Z1 g# ^, I% _9 ]- `+ j+ K
' K- j5 q2 J& }# |4 U' K/ B範例:& N7 b6 w) _( }5 h6 o
- K. n" w% Q/ d6 [; p, M" ~; }
! B. W- x' \$ e9 b0 a9 B, H3 U
5 ^" d$ }. l4 ~, y' obak_result = File.Find(SessionVar.Expand("%AppFolder%"), "*.bak", true, false, nil, nil);3 _6 F! ^- x- h' V7 U, z1 i1 t) C) K
for i,v in bak_result do# o% ]$ g9 O% M/ A5 d
File.Rename(v, String.TrimRight(v, ".bak"));
/ U: T. O6 c- Aend
' r" F3 d. U& P$ }. w) l
' i ~ @0 j( N, q0 U7 f! Z: Q
5 b& Q2 T1 a p5 x6 _7 X. U- @. q6 a3 E' W _0 j8 Z. C8 G
第一行,先用 File.Find 從安裝資料夾 %AppFolder% 中搜尋所有 .bak 的檔案(包含子資料夾),並將所有找到的檔案陣列存入 bak_result 這個變數。由於 %AppFolder% 是一個內建的變數,Setup Factory 7 中的所有內建變數必須使用 SessionVar.Expand() 將內建變數展開才能讀取內容。/ V! L' |3 P# X4 K/ x
第二行,利用這次說明的陣列處理迴圈來處理,它會一個一個取出存在 bak_result 中的變數。將索引存入 i;內容存入 v。
9 }, |$ Y5 m% Z B7 x+ F9 K第三行,利用 String.TrimRight 將每個檔案名稱後面的 .bak 字串刪掉,並利用 File.Rename 將變數中的檔案名稱重新命名為不含 .bak 字串的檔案名稱。由於我們只是要處理每個陣列元素的內容 v,用不到索引,所以索引 i 在這行程式中並未出現。
7 X/ S1 l9 N* O+ @第四行,結束迴圈。% Z% v% {7 B1 L: o8 y
3 M6 e F9 _% W1 s由於 File.Find 找到的 .bak 檔案,會包含他的路徑及檔案名稱,因此你只要設定讓 File.Find 同時去找子資料夾下的檔案,在後續更名的過程中它也會一併將子資料夾下的 .bak 檔案也回復成原來的檔案。1 M/ ~0 Y2 g3 A) V; Z* a) h
: }0 {& {% {$ e4 ?" u$ L+ u& x: b; ^如此一來,不管你的移除對象有數十個或上百個以上的 .bak,只要上面那四行程式碼,一次全可搞定。 |