2015-01-27 3 views
4

어떻게 NSIS 2.46에서 할 수 있습니까?빈 디렉토리 만들기 (NSIS)

나는 이것이 아마도 어리석은 질문이지만, 어떻게 빈 디렉터리를 만들고 오류를 확인합니까?

내가 그렇게 : 변수 $ R1이

  • 입니다

    ClearErrors 
    CreateDirectory $R1 
    ${If} ${Errors} 
        DetailPrint "failed" 
        MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Can not create folder $R1" 
        Abort 
    ${Else} 
        DetailPrint "done" 
    ${EndIf} 
    

    경우 "C : \ 테스트"- 수행을

  • "C : \ 사기꾼"
  • 는 - ("사기"를 실패 -
  • "qwer : \ TEST2") Windows에서 예약 - 수행
  • "qwer \ TEST3"- (없이 수행 ":")

왜 "test2"및 "test3"오류가 있습니까?

업데이트 : 오류를 만드는 방법?

답변

4

내가 결정 :

ClearErrors 
CreateDirectory $R1 
${If} ${Errors} 
${OrIfNot} ${FileExists} "$R1\*.*" 
    DetailPrint "failed" 
    MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Can not create folder $R1" 
    Abort 
${Else} 
    DetailPrint "done" 
${EndIf} 

더 많은 아이디어를 가지고?

3

오류를 확인하려면 올바르게 수행중인 오류 플래그를 확인해야합니다. 나는 문제가 당신이 따옴표를 사용한다 생각 :

CreateDirectory "$R1" 
+1

문제가 남아 있습니다. –

3

NSIS는 불행한 (IMHO) 경로 맹 글링을 수행하고 : 만 두 번째 문자로 받아들입니다. 그렇지 않으면 자동으로 제거됩니다. 즉, "qwer\test2""qwer:\test2"은 런타임에 동일하게 처리됩니다. 당신은 특별한 경로 레지스터 중 하나에 복사하여 확인할 수 있습니다 :이 "qwer\test2" 우리 잎이 상대 경로이며 CreateDirectory를 호출 할 때 사람들은 공식적으로 not supported 있습니다

!macro TestNsisPathMangling p 
Push $InstDir 
StrCpy $InstDir "${p}" 
DetailPrint "Old=${p}" 
DetailPrint "New=$InstDir" 
Pop $InstDir 
!macroend 

!insertmacro TestNsisPathMangling "qwer\test2" 
!insertmacro TestNsisPathMangling "qwer:\test2" 

. 당신이 NSIS 3이하려고하면 얻을해야합니다

CreateDirectory를 : 상대 경로는 지원되지

편집 : 경로는 사용자가 입력

경우에는 윈도우를 호출 할 수 있습니다 기능 GetFullPathName는 절대/전체 경로를 얻을 수 있습니다 :

Push "qwer\test3" 
System::Call 'KERNEL32::GetFullPathName(ts,i${NSIS_MAX_STRLEN},t.r1,t)i.r0' 
${If} $0 <> 0 
    DetailPrint "GetFullPathName=$1" 
${Else} 
    DetailPrint "GetFullPathName failed" 
${EndIf} 
+1

오류를 만드는 방법은 무엇입니까? –

+1

@AndreiKrasutski 그게 무슨 뜻입니까? 그냥 전체 경로를 사용하면 괜찮을 것입니다. – Anders

+1

변수 $ R1은 페이지 사용자 정의로 사용자를 설정하므로 잘못된 디렉토리를 설정할 수 있지만 확인해야합니다. –

0

documentation for CreateDirectory - 오히려 무책임한 - 분명히 error flag is set은 이것이 뜻하는 바에 관해 가끔 NSIS 스크립터에게 애매 모호한 말을 남깁니다.

놀랍지도 않지만 NSIS에서의 오류 처리는 very sparsely으로 기록되어 있습니다 ...하지만 다행스럽게도 그들은 주석을 철저히 읽으면 오류를 잡는 방법을 설명합니다.

이 설정되어있는 경우, 그것은 것입니다 고토 [first param]는, 그렇지 않으면 고토 [second param]

는 점프 GOTO 라인에 역행되는 문서에서 단어 goto 특별히주의한다. 즉시 명확하지 무엇

ClearErrors 
CreateDirectory $R1 
IfErrors 0 +2 
Call ErrorHandler 

+2가 OVER 오류 핸들러를 이동한다는 것입니다. 그리고 이제는 0NEXT LINE - 오류 처리기로 이동한다는 것을 추론 할 수 있습니다.

:ErrorHandler이 스크립트의 어딘가에 정의되어 있으면 위의 예에서 오류를 올바르게 처리해야하며, 원하는 논리로 바꿀 수 있습니다.

; Commenting heavily이 스크립팅 언어는 일상적으로 사용하지 않으면 읽을 수 없으므로 권장합니다.