创建一个空目录(NSIS)

时间:2015-01-27 11:30:47

标签: windows installer nsis error-checking create-directory

我如何通过NSIS 2.46做到这一点?

我知道这可能是一个愚蠢的问题,但是如何创建一个空目录并检查错误呢?

我这样做:

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

如果变量$ R1是

  • “c:\ test” - 已完成
  • “c:\ con” - 失败(“con” - 在Windows上保留)
  • “qwer:\ test2” - 已完成
  • “qwer \ test3” - 完成(没有“:”)

为什么“test2”和“test3”没有错误?

更新 如何使它成为一个错误?

4 个答案:

答案 0 :(得分:6)

我决定:

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}

有更多想法吗?

答案 1 :(得分:4)

为了检查错误,您应该检查错误标记,这是您正确的。我认为问题是你应该使用引号:

CreateDirectory "$R1"

答案 2 :(得分:3)

NSIS做了一些不幸的(恕我直言)路径修改,只接受:作为第二个字符,否则它会被默默剥离。这意味着"qwer\test2""qwer:\test2"在运行时被视为相同。您可以通过将其复制到其中一个特殊路径寄存器来验证这一点:

!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"

这给我们留下"qwer\test2",这是一个相对路径,在调用CreateDirectory时正式not supported。如果你在NSIS 3中尝试这个,你应该得到:

  

CreateDirectory:不支持相对路径

修改

如果用户输入了路径,您可以调用Windows函数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}

答案 3 :(得分: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 JUMPS OVER 不是很明显。现在可以推断0将转到 NEXT LINE - 错误处理程序。

上面的示例应该正确处理错误,因为在脚本的某处定义了:ErrorHandler,可以用你喜欢的任何逻辑替换它。

我建议使用; Commenting heavily,因为如果您每天不使用此脚本语言,则很难阅读。