针对Setup Factory 7的备份还原方法,希望对后来安装包制作有些作用。& N% O8 r' l* p. f
+ x. a: Z* O9 a r% a以下转自http://www.localsoft.tw/forum/viewthread.php?tid=2747 ]6 f) e) B" Z
+ ?% p/ K( Y+ ? s
[教學] Setup Factory 7 備份還原方法
* w" I$ `) }) s, xSetup Factory 7 可以設定在安裝時遇到要被覆蓋的檔案時自動將它備份成 .bak 的檔案並存放在與原始檔案相同的資料夾中。例如有下列三個檔案會被覆蓋:$ ^. y! R" q. Y3 s$ U5 @; F
& q# B% H+ X( ~; ~$ nabc.exe1 l" Q- d8 H! y
123.txt
' m( S/ }) X% k8 Y7 [+ ~\source\xyz.dll0 X: o& A `: F w7 ^
# X. q7 u' r/ Z5 F S3 W" ~
安裝後會被備份成:: \5 Z) O8 w. C. E7 L. s, O$ `0 }* ]* R
: w- m7 i3 l& {: eabc.exe.bak1 ^1 m+ }8 f# g) x
123.txt.bak: |" N7 l- Q. T# D
\source\xyz.dll.bak4 s( o& x' j0 y0 F" U- D) U
( f( X" C7 V8 r5 J& B. }: h/ ]之前做中文化時,使用 Setup Factory 7 製作中文安裝程式,如果在其中加入移除中文化的功能時,會遇到需要將之前備份的檔案一個一個更改回原始檔名的問題。所以每個檔案必須設定一次變更名稱的程式碼,三個就要設定三行,萬一有數十個時就頭大了。
& _; y* J2 I( X0 e! N" T
. c U! y) e7 H+ ?, o最近發現 Setup Factory 7 提供了一個很好用的處理陣列的迴圈,可以利用來一次處理所有需要改回原檔名的 .bak 備份檔案(甚至可包含子資料夾下的檔案)。這個迴圈是:
; R: H8 i8 @9 \1 z. V( I* ]
. U& n* ]# p' l+ H6 O+ T9 l - r6 k. O2 }. B
/ b H2 P, l' Q( h+ @+ o
For index,value in _array Do
" p8 f& N" t P5 k4 N- i# v1 a .....
# X R V1 _2 F5 `End
( o3 W2 w- X3 {" a/ a$ e* v$ f
b: n$ U5 @6 k' i1 @( Q; a' \# Q% Q8 b7 K% ^+ x. d
l4 }' N& \7 ^ x8 r
其中的 index 及 value 可以是隨便的自訂文字,如 i,v。index 是陣列中每個元素的索引;value 是陣列中每個元素的內容。_array 則要被處理的陣列 (一個用其他方法取得的變數陣列)。5 k6 A) U3 @# j% P/ i
. B" N: \( _ e, _+ B+ e. b
範例:3 Y ] X% C( ^: k. d+ v M: H- Y0 ^
% N9 w! Q1 O& b1 @6 Z3 q
1 `4 u1 _7 `( N) ~. g# D
+ h3 I2 S1 c/ U1 p# Cbak_result = File.Find(SessionVar.Expand("%AppFolder%"), "*.bak", true, false, nil, nil);( _0 ^1 ~' i; h, u
for i,v in bak_result do
' L# l, u- @0 S7 X- X File.Rename(v, String.TrimRight(v, ".bak"));" [. A, J9 z# U8 e
end
; S3 V* s" n( b9 G2 X2 A$ r4 Q+ K1 _/ ?) F9 W* E5 y
; @2 r0 v; D. @9 H' x! o& m& T6 R# [
第一行,先用 File.Find 從安裝資料夾 %AppFolder% 中搜尋所有 .bak 的檔案(包含子資料夾),並將所有找到的檔案陣列存入 bak_result 這個變數。由於 %AppFolder% 是一個內建的變數,Setup Factory 7 中的所有內建變數必須使用 SessionVar.Expand() 將內建變數展開才能讀取內容。& e9 c0 X% A( o1 Q! ~8 z( L v
第二行,利用這次說明的陣列處理迴圈來處理,它會一個一個取出存在 bak_result 中的變數。將索引存入 i;內容存入 v。
8 f4 `4 ~) L4 e- u ]% Z% `4 [第三行,利用 String.TrimRight 將每個檔案名稱後面的 .bak 字串刪掉,並利用 File.Rename 將變數中的檔案名稱重新命名為不含 .bak 字串的檔案名稱。由於我們只是要處理每個陣列元素的內容 v,用不到索引,所以索引 i 在這行程式中並未出現。. t" Z( a# |8 S6 H. J9 D( r
第四行,結束迴圈。' _$ Q/ h# D* b3 q: f3 z3 y, X) S
6 [) y4 I/ _& q3 B! P
由於 File.Find 找到的 .bak 檔案,會包含他的路徑及檔案名稱,因此你只要設定讓 File.Find 同時去找子資料夾下的檔案,在後續更名的過程中它也會一併將子資料夾下的 .bak 檔案也回復成原來的檔案。6 h0 R& Z+ ~; s/ e5 }; g
% h$ O. @' F" M5 ^: U/ }. Z
如此一來,不管你的移除對象有數十個或上百個以上的 .bak,只要上面那四行程式碼,一次全可搞定。 |