当前位置:Nanlon > 经验教程 > 正文

NSIS打包单文件时的主程序参数传导示例

Tips:本文最后更新于2020-05-24 18:01:15,某些文章具有时效性,若有错误或已失效,请在下方留言或联系Nanlon

在我们打包某些带有特殊启动参数的程序为单文件时,为了使主程序参数能在打包后被正常使用,需要将参数传递到单文件安装包外部。这个示例即为演示如何实现此功能!

/*
*  NSIS打包单文件时的主程序参数传导示例
*  ===============================================
*  在我们打包某些带有特殊启动参数的程序为单文件时,
*  为了使主程序参数能在打包后被正常使用,需要将参数传递到单文件安装包外部。
*  这个示例即为演示如何实现此功能!
*/

# Include
!include "FileFunc.nsh"

# APP
!define APPNAME "Test"
!define APP_VER "1.0.0.0"
!define APP_PUB "nanlon.cn"
!define DIR_TMP "TestTmp"

# VER
VIProductVersion "${APP_VER}"
VIAddVersionKey /LANG=2052 "ProductName"     "${APPNAME}"
VIAddVersionKey /LANG=2052 "ProductVersion"  "${APP_VER}"
VIAddVersionKey /LANG=2052 "LegalCopyright"  "© ${APP_PUB}. All Right Reserved."
VIAddVersionKey /LANG=2052 "FileDescription" "${APPNAME}"
VIAddVersionKey /LANG=2052 "FileVersion"     "${APP_VER}"

# SET
Unicode true
SetOverwrite try
SilentInstall silent
RequestExecutionLevel admin

# Setup
Name "${APPNAME}"
OutFile "${APPNAME}_v${APP_VER}.exe"

# --- Init Function ---

Function .onInit
    InitPluginsDir
    
    # Create Mutex
    System::Call `kernel32::CreateMutex(i0,i0,t"${APPNAME}_installer")i.r1?e`
    Pop $R0
    StrCmp $R0 0 +3
    MessageBox MB_OK|MB_ICONEXCLAMATION "程序已在运行,不能重复打开!"
    Abort
    
    Var /GLOBAL Command
    ${GetParameters} $Command

    # Out Files
    SetOutPath "$TEMP\${DIR_TMP}"
    File /r ".\${APPNAME}\*.*"
    
# --- RunExe ---
    
    ${If} $R5 == "/i"                                # 带参数 "/i" 运行时执行
    ExecWait `"$TEMP\${DIR_TMP}\${APPNAME}.exe" /i`  /*       /i          */
    ${ElseIf} $R5 == "-q"                            # 带参数 "-q" 运行时执行
    ExecWait `"$TEMP\${DIR_TMP}\${APPNAME}.exe" -q`  /*       -q          */
    ${Else}                                          # 不带参数或输入了其他错误参数时
    ExecWait "$TEMP\${DIR_TMP}\${APPNAME}.exe"
    ${EndIf}

# --- Uninst ---

    # Delete Files
    SetOutPath "$TEMP"
    RMDir /r "$TEMP\${DIR_TMP}"

    Abort
FunctionEnd

Section -

SectionEnd

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏
作者保留所有权,侵删请联系,转载请注明: » Nanlon » NSIS打包单文件时的主程序参数传导示例

评论4

  1. #1

    请教博主一个问题:
    ReadEnvStr $R8 SYSTEMDRIVE
    CreateDirectory “$R8\A”
    RMDir /r “$R8\A”
    我用上面的脚本封包,在系统盘建立文件夹成功,但是卸载时缺无法删除文件夹,是哪里出错了?

    81个月前 (05-27)回复
    • 1、建议你定义一个用户变量而不是使用内置变量(常用于公用函数或宏,当你在公用代码里使用他们的时候不能有任何名字冲突。当在公用代码里使用的时候,推荐你使用堆栈保存和恢复他们原来的数据)
      2、系统根目录文件夹的删除最好不要直接使用 RMDir /r “$R8\A” 这种形式,容易引起误操作;
      3、有时候无法删除可能是文件夹下某文件占用引起。

      Nanlon1个月前 (05-27)回复
      • 好的,谢谢

        81个月前 (05-27)回复
    • Var SYSDRI
      
      ...
      
      ReadEnvStr $SYSDRI SYSTEMDRIVE
      CreateDirectory "$SYSDRI\A"
      
      ...
      
      Delete "$SYSDRI\A\a01"
      Delete "$SYSDRI\A\a02"
      RMDir "$SYSDRI\A"
      
      Nanlon1个月前 (05-27)回复