2011-12-07 65 views
4

短篇小說

大家好,NSIS遞歸文件日誌

有旅行遞歸目錄與NSIS在編譯時間的方法嗎?

感謝


說來話長

大家好,

我試圖創建一個NSIS安裝一個軟件,我發展。我們設置的構建系統創建一個文件夾,其中包含在Windows上運行該軟件所需的一切(dll,exes,圖像,庫,示例等)。該文件夾有+400個文件和文件夾。使用HM NIS Edit,可以生成安裝所有內容所需的「文件」和「SetOutPath」序列,但只是巨大,醜陋,如果添加或刪除了某些文件,則必須手動更改腳本。

所以......我們刪除「文件」和「SetOutPath」和剛剛添加的生成的序列:

File /r "C:\path\to\output\dir" 

它的偉大工程......但現在我們有一個卸載程序問題,因爲我們不能這樣做:

RMDir /r $INSTDIR 

因爲是危險的(如此處所述:http://nsis.sourceforge.net/Docs/Chapter4.html#4.9.1.8)。

所以,我們試圖實現給那裏的建議:在卸載http://nsis.sourceforge.net/Uninstall_only_installed_files

該解決方案創造在哪裏NSIS寫的所有的「文件」和「SetOutPath」操作日誌,因此它可以回退(刪除) 。問題是包含的宏不支持「File」的遞歸選項。

我試圖實現一個遞歸版本,在文件夾上遞歸遍歷,但是我覺得我做錯了(當然,我敢肯定:P):

!include "RecFind.nsh" 

Section "Principal" SEC01 
    ${SetOutPath} "$INSTDIR" 
    SetOverwrite try 

    ${RecFindOpen} "..\executable" $R0 $R1 
    DetailPrint "Looking into directory: $R0" 
    ${SetOutPath} "$R0" 
    ${RecFindFirst} 
    DetailPrint "Looking file: $R0\$R1" 
    ${File} "$R0" "$R1" 
    ${RecFindNext} 
    ${RecFindClose} 

使用這http://nsis.sourceforge.net/RecFind:_Recursive_FindFirst,_FindNext,_FindClose 但我認爲,只在安裝時間工作。

我到目前爲止發現的解決方案是創建一個安裝腳本,其中包含一個用作模板的NSIS文件(帶有「File」和「SetOutPath」列表的一些佔位符標記),一個Python腳本輸出目錄,並創建所需的「文件」和「SetOutPath」的序列,然後寫入最終NSIS腳本...但我真的不喜歡它:S

所以我的問題是:

有一種在編譯時使用NSIS遞歸傳遞目錄的方法?

(或者說,我怎麼能只用NSIS實現這一目標?)。

在此先感謝。

親切的問候

回答

3
!ifdef GENFILELIST 
outfile "${GENFILELIST}.exe" 
requestexecutionlevel user 
silentinstall silent 
Var ins 
Var uns 
Function ProcessDir 
Pop $R1 ;reldir 
Pop $R0 ;absdir 
Push $0 
Push $1 
FileWrite $ins 'Push $$Outdir$\n' 
FileWrite $ins 'SetOutPath "$$instdir\$R1"$\n' 
FindFirst $0 $1 "$R0\*" 
loop: 
    StrCmp "" $1 done 
    StrCmp "." $1 next 
    StrCmp ".." $1 next 
    IfFileExists "$R0\$1\*.*" 0 processfile 
     Push $R0 
     Push $R1 
     Push "$R0\$1" 
     Push "$R1$1\" 
     call ProcessDir 
     Pop $R1 
     Pop $R0 
     goto next 
processfile: 
    FileWrite $ins 'File "${SRCDIR}\$R1$1"$\n' 
    FileWrite $uns 'Delete "$$instdir\$R1$1"$\n' 
next: 
    FindNext $0 $1 
    Goto loop 
done: 
FindClose $0 
FileWrite $uns 'RMDir "$$instdir\$R1"$\n' 
FileWrite $ins 'Pop $$Outdir$\n' 
Pop $1 
Pop $0 
FunctionEnd 
section 
FileOpen $ins "${GENFILELIST}ins" w 
FileOpen $uns "${GENFILELIST}uns" w 
Push "${SRCDIR}" 
Push "" 
call ProcessDir 
sectionend 
!else 
!tempfile FILELIST 
!system '"${NSISDIR}\makensis" -NOCD "-DGENFILELIST=${FILELIST}" "-DSRCDIR=.\myfiles" "${__FILE__}"' = 0 
!system '"${FILELIST}.exe"' = 0 
!delfile "${FILELIST}" 
!delfile "${FILELIST}.exe" 

### Main script starts here ### 

outfile test.exe 

page directory 
page instfiles 

section 
SetOutPath $instdir 
WriteUninstaller "$instdir\uninst.exe" 
!include "${FILELIST}ins" 
!delfile "${FILELIST}ins" 
sectionend 

section uninstall 
!include "${FILELIST}uns" 
!delfile "${FILELIST}uns" 
Delete "$instdir\uninst.exe" 
RMDir "$instdir" 
sectionend 

!endif 

這使用!系統生成一個靜默安裝程序,並在執行此靜默安裝程序會生成帶文件文本文件和刪除命令,真正的安裝腳本!包括的這些來執行安裝/卸載命令。

你可以使用!系統執行什麼,一個批處理文件,Windows腳本宿主,蟒蛇等