针对Setup Factory 7的备份还原方法,希望对后来安装包制作有些作用。
) L& I( {. k9 s. r0 T5 {- [
$ `' f( {- l) L" w8 U; Q以下转自http://www.localsoft.tw/forum/viewthread.php?tid=2747, s- Z. K) c1 y* g, Y+ ?! D7 i
3 s5 v+ {* e, F" ^. W$ e+ Y3 w[教學] Setup Factory 7 備份還原方法5 w( B: F; ^& _6 X$ d0 a* n
Setup Factory 7 可以設定在安裝時遇到要被覆蓋的檔案時自動將它備份成 .bak 的檔案並存放在與原始檔案相同的資料夾中。例如有下列三個檔案會被覆蓋:, I e/ T" _/ z {: E* _
( G& R+ q9 ~6 j- t
abc.exe
: ~* v+ w# g/ R; ]+ f123.txt& _9 ~3 N& J" e1 \$ D' g9 y
\source\xyz.dll( s. o1 i s5 s% `3 D
2 D m! \% D5 b5 d2 E$ n安裝後會被備份成:9 z8 v4 O" [$ z7 Z
1 U4 q( Z& a. C+ M/ qabc.exe.bak
# T2 c+ m7 k: r& {7 o3 x123.txt.bak/ D' G0 ?1 l1 ?
\source\xyz.dll.bak
1 S0 L/ R l+ k- {+ \
0 v3 A/ ]+ d" ?之前做中文化時,使用 Setup Factory 7 製作中文安裝程式,如果在其中加入移除中文化的功能時,會遇到需要將之前備份的檔案一個一個更改回原始檔名的問題。所以每個檔案必須設定一次變更名稱的程式碼,三個就要設定三行,萬一有數十個時就頭大了。
! C N( j. `/ D0 [
: Y$ G. {. j" Y- P最近發現 Setup Factory 7 提供了一個很好用的處理陣列的迴圈,可以利用來一次處理所有需要改回原檔名的 .bak 備份檔案(甚至可包含子資料夾下的檔案)。這個迴圈是:
; [$ L7 c; t% M) q k$ G* ]/ J) S/ d# P' E3 k
7 r% A9 {5 V0 u. j5 ?1 p: X; n! }
7 b; E+ c \1 U7 G' ?& Y
For index,value in _array Do+ P- K' v0 F/ ]( k5 }8 Q& j: U5 A4 R
.....; o7 G9 F S6 v! p
End
" K8 ~8 h" `! `! t0 b
7 a( T6 b; J! M) z& A* L: T& n- e4 U; q! J$ K
! ?& Q; e, {# S1 [5 r! M& Q其中的 index 及 value 可以是隨便的自訂文字,如 i,v。index 是陣列中每個元素的索引;value 是陣列中每個元素的內容。_array 則要被處理的陣列 (一個用其他方法取得的變數陣列)。
. }: ~* s& K3 R$ M9 \: F3 ?1 c5 N
z! Y6 R4 D) H範例:
1 T4 K- p0 O) ^& H7 l3 z* a$ N& Q6 |; b
$ i! J9 |: Y9 y( h1 E, Q: Y6 c+ f, z' Y Z5 `; b
bak_result = File.Find(SessionVar.Expand("%AppFolder%"), "*.bak", true, false, nil, nil);
/ B) t" g. u9 k8 H6 t! Q7 ~ Ofor i,v in bak_result do
% d) b9 J( V; X, l3 U" r File.Rename(v, String.TrimRight(v, ".bak"));9 P; a0 G0 a R: _& H- D% |) O" O
end 8 b) [) _! y/ `
w5 W7 |6 {% L1 A$ G8 U/ A
0 Y1 y6 ~6 N: z- b+ T- _. W% o
% [# e- [& A* b, N9 ?7 n& b' ~% I \第一行,先用 File.Find 從安裝資料夾 %AppFolder% 中搜尋所有 .bak 的檔案(包含子資料夾),並將所有找到的檔案陣列存入 bak_result 這個變數。由於 %AppFolder% 是一個內建的變數,Setup Factory 7 中的所有內建變數必須使用 SessionVar.Expand() 將內建變數展開才能讀取內容。
2 C- M8 q+ T- y& X* E2 ` ]! u第二行,利用這次說明的陣列處理迴圈來處理,它會一個一個取出存在 bak_result 中的變數。將索引存入 i;內容存入 v。* g v9 ]8 F2 i4 I4 u2 B6 b8 Y5 `% V
第三行,利用 String.TrimRight 將每個檔案名稱後面的 .bak 字串刪掉,並利用 File.Rename 將變數中的檔案名稱重新命名為不含 .bak 字串的檔案名稱。由於我們只是要處理每個陣列元素的內容 v,用不到索引,所以索引 i 在這行程式中並未出現。
% {# Y" C0 Z& t& a第四行,結束迴圈。, E% n2 ~2 ]# Z* D$ D0 P* [ P/ z
+ H8 Z1 L R8 D# T$ |8 p0 y+ f由於 File.Find 找到的 .bak 檔案,會包含他的路徑及檔案名稱,因此你只要設定讓 File.Find 同時去找子資料夾下的檔案,在後續更名的過程中它也會一併將子資料夾下的 .bak 檔案也回復成原來的檔案。
$ c8 E+ N: s, F/ f
0 l5 T* s% `+ U: `9 z4 r如此一來,不管你的移除對象有數十個或上百個以上的 .bak,只要上面那四行程式碼,一次全可搞定。 |