2014-07-06 6 views
0

NSIS를 사용하여 새 버전을 설치하기 전에 이전에 설치 한 버전의 설치 제거 프로그램을 설치 프로그램에서 호출하고 싶습니다. 이에 대한 proposed solution 다음 명령을 실행하는 것입니다NSIS 설치 프로그램에서 NSIS 설치 제거 프로그램이 완료 될 때까지 기다리는 중 실패하거나 제거 프로그램이 삭제되지 않습니다.

ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR' 

지금까지 내가 이해 한, _?=$INSTDIRExecWait이 진정으로 대기 할 필요가있다. 이 파일이 없으면 NSIS는 제거 프로그램을 임시 디렉토리에 복사하고 거기서 시작한 다음 제거 프로그램이 끝나기 전에 되돌아갑니다. 이 해결책의 문제점은 제거 프로그램이 $ INSTDIR에서 직접 실행된다는 것입니다.

Delete "$INSTDIR\uninstall.exe" 

를 지금까지 내가 이해로, uninstall.exe가 삭제되지 않는 이유는 현재 실행중인 파일이 삭제되지 않을 수있다 : 이것은 내 제거 프로그램에서 다음 명령이 실패 효과로 이어집니다. 내 문제를 요약 : 제거가 완료 될 때까지

ExecWait '"$INSTDIR\uninstall.exe"' 

기다리지 않습니다 및
ExecWait '"$INSTDIR\uninstall.exe" _?=$INSTDIR' 

은 제거 프로그램 자체를 삭제하는 것을 허용하지 않습니다. 누군가 제거 프로그램이 제거 프로세스에서 즉시 삭제할 수 있도록 동시에 제거 프로그램이 완료 될 때까지 기다리는 방법을 알고 있습니까?

+0

ExecWait는 항상 내가 ExecWait 만 제거 될 때까지 기다리는 읽어 – Anders

+0

...이 자식 프로세스 그냥 빨리 완료 귀하의 경우, 자식 프로세스를 기다린다 temp 디렉토리에 복사되고 시작됩니다. 그것은 확실히 finsih에 제거 프로그램을 기다리지 않습니다. 나는 이것을 몇몇 메시지 박스를 사용하여 시험했다. – honk

+0

ExecWait은 일반 명령이며 항상 자식 프로세스를 기다립니다. 실행 한 (제거 프로그램) 항목이 신속하게 종료된다는 사실은 ExecWaits 오류가 아닙니다. ExecWait은 기본 CreateProcess 및 WaitForSingleObject 함수를 둘러싼 씬 래퍼입니다. – Anders

답변

3

_?= 매개 변수는 제거 프로그램에 이 아니고이 자신을 %temp%으로 복사하고 완료 될 때까지 기다리지 않고 실행한다는 것을 알려줍니다. _?= 이후의 경로는 제거 프로그램에서 $ InstDir을 초기화하는 데 사용됩니다. 당신의 설치에

이 같은 작업을 수행 할 수 있습니다

InitPluginsDir 
;ReadRegStr $oldinstall ... ; Somehow detect old install 
CreateDirectory "$pluginsdir\unold" ; Make sure plugins do not conflict with a old uninstaller 
CopyFiles /SILENT /FILESONLY "$oldinstall\uninst.exe" "$pluginsdir\unold" 
ExecWait '"$pluginsdir\unold\uninst.exe" _?=$oldinstall' 
+0

답변 해 주셔서 감사합니다! 나는 실제로 당신이 아이디어를 가지고 있기를 바랬다;) 당신의 솔루션은 훌륭하게 보였다. 그것을 이해하는 데 단지 30 분이 걸렸습니다 :) 당신은 정말로 나에게 뭔가 새로운 것을 가르쳐주었습니다! 내게 그것을 밖으로 시도 할 시간을주세요 ... – honk

+0

좋아, 내가 내 설치 프로그램에 솔루션을 통합하고 그것을 테스트했습니다. 완벽하게 작동합니다! 다시 한 번 감사드립니다! – honk