1. 程式人生 > >nsis打包指令碼

nsis打包指令碼

最近在打包一個WEB程式,執行環境是PHP+Apache2+Mysql。打包過程比較順利,註冊服務、啟動都能成功。遇到一個問題,就是修改配置檔案的問題。既然是打包程式,當然要求打包的程式可以安裝在任意位置都能夠正常執行,修改apache伺服器的httpd.conf檔案費了我不少功夫,因為對NSIS並不熟悉。查找了一些資料,找到一些程式碼後面成功了。把這些程式碼貼出來,也許對遇到我同樣問題的人有所幫助。

http://nsis.sourceforge.net/More_advanced_replace_text_in_file

替換檔案中字元的函式:

Nsis程式碼 複製程式碼
  1. /*替換文字function*/   
  2. Function AdvReplaceInFile   
  3. Exch $0 ;file to replace in   
  4. Exch   
  5. Exch $1 ;number to replace after   
  6. Exch   
  7. Exch 2
  8. Exch $2 ;replace and onwards   
  9. Exch 2
  10. Exch 3
  11. Exch $3 ;replace with   
  12. Exch 3
  13. Exch 4
  14. Exch $4 ;to replace   
  15. Exch 4
  16. Push $5 ;minus count   
  17. Push $6 ;universal   
  18. Push $7 ;end string   
  19. Push $8 ;left string   
  20. Push $9 ;right string   
  21. Push $R0 ;file1   
  22. Push $R1 ;file2   
  23. Push $R2 ;read   
  24. Push $R3 ;universal   
  25. Push $R4 ;count (onwards)   
  26. Push $R5 ;count (after)   
  27. Push $R6 ;temp file name   
  28.   GetTempFileName $R6   
  29.   FileOpen $R1 $0 r ;file to search in   
  30.   FileOpen $R0 $R6 w ;temp file   
  31.    StrLen $R3 $4
  32.    StrCpy $R4 -1
  33.    StrCpy $R5 -1
  34. loop_read:   
  35.  ClearErrors   
  36.  FileRead $R1 $R2 ;read line   
  37.  IfErrors exit   
  38.    StrCpy $50
  39.    StrCpy $7 $R2   
  40. loop_filter:   
  41.    IntOp $5 $5 - 1
  42.    StrCpy $6 $7 $R3 $5 ;search   
  43.    StrCmp $6"" file_write2   
  44.    StrCmp $6 $40 loop_filter   
  45. StrCpy $8 $7 $5 ;left part   
  46. IntOp $6 $5 + $R3   
  47. IntCmp $60 is0 not0   
  48. is0:   
  49. StrCpy $9""
  50. Goto done   
  51. not0:   
  52. StrCpy $9 $7"" $6 ;right part   
  53. done:   
  54. StrCpy $7 $8$3$9 ;re-join   
  55. IntOp $R4 $R4 + 1
  56. StrCmp $2 all file_write1   
  57. StrCmp $R4 $20 file_write2   
  58. IntOp $R4 $R4 - 1
  59. IntOp $R5 $R5 + 1
  60. StrCmp $1 all file_write1   
  61. StrCmp $R5 $10 file_write1   
  62. IntOp $R5 $R5 - 1
  63. Goto file_write2   
  64. file_write1:   
  65.  FileWrite $R0 $7 ;write modified line   
  66. Goto loop_read   
  67. file_write2:   
  68.  FileWrite $R0 $R2 ;write unmodified line   
  69. Goto loop_read   
  70. exit:   
  71.   FileClose $R0   
  72.   FileClose $R1   
  73.    SetDetailsPrint none   
  74.   Delete $0
  75.   Rename $R6 $0
  76.   Delete $R6   
  77.    SetDetailsPrint both   
  78. Pop $R6   
  79. Pop $R5   
  80. Pop $R4   
  81. Pop $R3   
  82. Pop $R2   
  83. Pop $R1   
  84. Pop $R0   
  85. Pop $9
  86. Pop $8
  87. Pop $7
  88. Pop $6
  89. Pop $5
  90. Pop $0
  91. Pop $1
  92. Pop $2
  93. Pop $3
  94. Pop $4
  95. FunctionEnd   
  96. /*替換文字function*/  

    /*替換apache2 httpd.conf檔案文字*/

Nsis程式碼 複製程式碼
  1. Push "C:/Program Files/Apache2" #text to be replaced   
  2. Push "$INSTDIR" #replace with   
  3. Push all #replace all occurrences   
  4. Push all #replace all occurrences   
  5. Push "$INSTDIR/apache2/conf/httpd.conf" #file to replace in   
  6. Call AdvReplaceInFile    

同樣的方法,替換php.ini檔案和my.ini檔案中的相關字元即可

   /*註冊apache伺服器, -n MyWebServer表示apache2註冊服務名為MyWebServer,預設服務名為Apache2 */

Nsis程式碼 複製程式碼
  1. nsExec::ExecToLog 'cmd.exe /c "$INSTDIR/apache2/bin/httpd.exe" -k install -n MyWebServer'

  /*註冊MySQL伺服器, MyDBServer表示MySQL註冊服務名為MyDBServer,預設服務名為MySQL*/

Nsis程式碼 複製程式碼
  1. nsExec::ExecToLog 'cmd.exe /c "$INSTDIR/mysql5/bin/mysqld-nt.exe" -install MyDBServer'

 啟動apache服務和MySQL服務

Nsis程式碼 複製程式碼
  1. nsExec::ExecToLog 'cmd.exe /c "$INSTDIR/apache2/bin/httpd.exe" -k start -n MyWebServer'
  2. 或者   
  3. nsExec::ExecToLog 'cmd.exe /c net start MyWebServer'
  4. nsExec::ExecToLog 'cmd.exe /c net start MyDBServer'