Windows 创建空目录(NSIS)

Windows 创建空目录(NSIS),windows,installation,nsis,error-checking,create-directory,Windows,Installation,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"

我怎样才能通过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”没有错误

更新:
如何确定这是一个错误?

为了检查错误,你应该检查错误标志,你做得对。我认为问题在于你应该使用引号:

CreateDirectory "$R1"
我决定:

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}

有更多的想法吗?

NSIS进行了一些不幸的(IMHO)路径破坏,只接受
作为第二个字符,否则它会被自动删除。这意味着运行时对
“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}
Push“qwer\test3”
系统::调用'KERNEL32::GetFullPathName(ts,i${NSIS\u MAX\u STRLEN},t.r1,t)i.r0'
${If}$0
DetailPrint“GetFullPathName=$1”
${Else}
DetailPrint“GetFullPathName失败”
${EndIf}
相当不负责任地说,
错误标志设置了
,这让偶尔的NSIS脚本编写者对这意味着什么产生了歧义

毫不奇怪,NSIS中的错误处理也有文档记录。。。但幸运的是,如果你仔细阅读评论,它们确实解释了如何捕捉错误

如果设置了,它将转到
[第一个参数]
,否则它将转到
[第二个参数]

特别注意文档中的单词
goto
,它是goto跳行的回溯

ClearErrors
CreateDirectory $R1
IfErrors 0 +2
Call ErrorHandler
不明显的是,
+2
跳过了错误处理程序。现在可以推断
0
将转到下一行——错误处理程序

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


我推荐
;如果你不每天使用这种脚本语言,就很难阅读它。

@AndreiKrasutski这是什么意思?只要使用完整路径,就可以了。变量$R1在页面自定义中设置用户,因此它可以设置一个坏目录,但我必须检查。