创建一个空目录(NSIS)
Creating an empty directory (NSIS)
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 做了一些不幸的(恕我直言)路径修改,只接受 :
作为第二个字符,否则它会被默默地删除。这意味着 "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: Relative paths not supported
编辑:
如果路径是由用户输入的,您可以调用 Windows 函数 GetFullPathName
来获取 absolute/full 路径:
Push "qwer\test3"
System::Call 'KERNEL32::GetFullPathName(ts,i${NSIS_MAX_STRLEN},t.r1,t)i.r0'
${If} [=11=] <> 0
DetailPrint "GetFullPathName="
${Else}
DetailPrint "GetFullPathName failed"
${EndIf}
documentation for CreateDirectory
——相当不负责任——直截了当地说error flag is set
让偶尔的 NSIS 脚本编写者不清楚这是什么意思。
毫不奇怪,NSIS 中的错误处理也被记录在案 very sparsely...但幸运的是,如果您仔细阅读评论,他们确实解释了如何捕获错误。
if it is set, it will goto [first param]
, otherwise it will goto [second param]
请特别注意文档中的 goto
一词,这是对 GOTO 跳行.
的回溯
ClearErrors
CreateDirectory $R1
IfErrors 0 +2
Call ErrorHandler
不是很明显的是 +2
JUMPS OVER 错误处理程序。现在可以推断 0
将转到 下一行 -- 错误处理程序。
如果 :ErrorHandler
是在脚本中某处定义的,上面的示例应该可以正确处理错误,可以用您喜欢的任何逻辑替换它。
我推荐 ; Commenting heavily
,因为如果您不每天使用这种脚本语言,可能会难以阅读。
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 做了一些不幸的(恕我直言)路径修改,只接受 :
作为第二个字符,否则它会被默默地删除。这意味着 "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: Relative paths not supported
编辑:
如果路径是由用户输入的,您可以调用 Windows 函数 GetFullPathName
来获取 absolute/full 路径:
Push "qwer\test3"
System::Call 'KERNEL32::GetFullPathName(ts,i${NSIS_MAX_STRLEN},t.r1,t)i.r0'
${If} [=11=] <> 0
DetailPrint "GetFullPathName="
${Else}
DetailPrint "GetFullPathName failed"
${EndIf}
documentation for CreateDirectory
——相当不负责任——直截了当地说error flag is set
让偶尔的 NSIS 脚本编写者不清楚这是什么意思。
毫不奇怪,NSIS 中的错误处理也被记录在案 very sparsely...但幸运的是,如果您仔细阅读评论,他们确实解释了如何捕获错误。
if it is set, it will goto
[first param]
, otherwise it will goto[second param]
请特别注意文档中的 goto
一词,这是对 GOTO 跳行.
ClearErrors
CreateDirectory $R1
IfErrors 0 +2
Call ErrorHandler
不是很明显的是 +2
JUMPS OVER 错误处理程序。现在可以推断 0
将转到 下一行 -- 错误处理程序。
如果 :ErrorHandler
是在脚本中某处定义的,上面的示例应该可以正确处理错误,可以用您喜欢的任何逻辑替换它。
我推荐 ; Commenting heavily
,因为如果您不每天使用这种脚本语言,可能会难以阅读。