2010-07-21 1 views
1

내가 가진 :NSIS RMDir을 하위 디렉토리로 작동시키는 방법은 무엇입니까? NSIS 설치 스크립트에서

RMDir "$INSTDIR" 

을 이제 사용자가 C:\Program Files\Product에 설치 디렉토리를 설정하면, 그들이 예를 들어 C:\Program Files\Company\Product로, 깊은 뭔가 설치하지만 경우에, 잘 작동, RMDIR는 못된 "Product"는 제외하고 "Company"는 제외합니다. 어떻게 내가 루트 디렉토리 (/ r을 사용하지 않고)까지 빈 디렉토리를 삭제할 수 있습니까? 비어있는 경우 제품 삭제, 비어있는 경우 회사 삭제, 비어있는 경우 프로그램 파일 삭제, 등등?


편집 : 내가 사용하여 종료 기능 :

# Delete empty directories recursively 
var deleteDir 
var dirLength 
Function un.PathDeleteEmptyDirRecurse 
ClearErrors 
loop: 
    Sleep 50 ; Without a small delay here, the directory sometimes won't get removed 
    RMDir "$deleteDir" ; Remove the directory 
    IfErrors end 
    strlen $dirLength $deleteDir ; Store the length of the path 
    intcmp $dirLength 3 end end ; If the length of the path is <= 3 (e.g. C:\), we're at the root drive 
    GetFullPathName $deleteDir "$deleteDir\.." ; <path>\.. results in the parent directory of <path> 
    IfErrors end loop 
end: 
FunctionEnd 

답변

3

나는 가정 당신은 제거 프로그램이 원하는 아닌 설치 :

여기
Function un.PathDeleteEmptyDirRecurse 
exch $0 
push $1 
ClearErrors 
loop: 
RMDir $0 
IfErrors end 
strlen $1 $0 
intcmp $1 3 end end ;root of drive? 
GetFullPathName $0 "$0\.." 
IfErrors end loop 
end: 
pop $1 
pop $0 
FunctionEnd 

... 

push $instdir 
call un.PathDeleteEmptyDirRecurse 
+0

감사합니다. 한 가지를 제외하면이 기능은 훌륭합니다. 두 번 연속해서 호출하는 방법은 무엇입니까? 'push $ instdir1 \ call un.PathDeleteEmptyDirRecurse \ push $ instdir2 \ call un.PathDeleteEmptyDirRecurse' (줄 바꿈을 시뮬레이트하기 위해 \ 사용)가 작동하지 않습니다. –

+0

@ Jake Petroules : 시도 할 때 잘 작동합니다. http://nsis.pastebin.com/5JgDwcEH (트리의 _deepest_ 폴더에서 시작해야합니다.) – Anders

+0

가장 깊은 폴더에서 시작하고 있습니다. 아주 당황 스럽습니다. 이것은 내 NSIS 스크립트에서 가지고 있습니다 : http://nsis.pastebin.com/1scSjsgM –

0

내가 무엇을 사용;

Function un.RMDirUP 
    !define RMDirUP '!insertmacro RMDirUPCall' 
    !macro RMDirUPCall _PATH 
     push '${_PATH}' 
     Call un.RMDirUP 
    !macroend 

    ; $0 - current folder 
    ClearErrors 
    Exch $0 
    RMDir "$0\.." 
    IfErrors Skip 
    ${RMDirUP} "$0\.." 
    Skip: 
    Pop $0 
FunctionEnd 

이하자 당신이 ${RMDirUP} "$INSTDIR"

-2

드디어 (비어있는 경우) 설치 디렉토리의 모든 및 디렉토리 자체를 삭제 단지이 두 줄을 사용하여 종료와 제거에 전화 :

RMDir /r "$INSTDIR" 
RMDir "$INSTDIR\..\." 
+1

이것은 매우 위험합니다. 사용자가 c : \ 또는 c : \ program files \에 설치하도록 선택하면 어떻게됩니까? 해당 폴더의 모든 파일과 하위 디렉토리를 제거했습니다. – ehambright