创build一个空目录(NSIS)

我怎样才能通过NSIS 2.46?

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

我这样做:

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

如果variables$ 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做了一些不幸的(恕我直言)路径捣毁,只接受:作为第二个字符,否则它被无声地剥离。 这意味着"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}