6

我如何通过 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

4 回答 4

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}

有更多想法?

于 2015-01-28T13:32:24.610 回答
5

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

CreateDirectory "$R1"
于 2015-01-27T11:59:04.213 回答
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 时官方不支持这些路径。如果你在 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}
于 2015-01-28T19:01:13.267 回答
0

文档CreateDirectory- 相当不负责任地 - 明确表示将error flag is set模糊性留给偶尔的 NSIS 脚本编写者,以了解这意味着什么。

毫不奇怪,NSIS 中的错误处理记录也很少……但幸运的是,如果您仔细阅读评论,它们确实解释了如何捕获错误。

如果已设置,它将转到[first param],否则将转到[second param]

特别注意文档中的单词,它是对 GOTO line jumpinggoto的回归。

ClearErrors
CreateDirectory $R1
IfErrors 0 +2
Call ErrorHandler

不是很明显的是+2 JUMPS OVER错误处理程序。现在可以推断出0将转到下一行——错误处理程序。

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

我推荐; Commenting heavily这种脚本语言,因为如果您不每天使用它,可能会难以阅读。

于 2018-03-10T03:21:47.917 回答