代码之家  ›  专栏  ›  技术社区  ›  MatsT

NSIS-在命令行安装期间打印到提示符

  •  6
  • MatsT  · 技术社区  · 15 年前

    我正在使用NSIS为windows制作安装程序,并且有许多用户可以使用命令行指定的自定义安装选项,例如:

    installer.exe /IDPATH=c:\Program Files\Adobe\Adobe InDesign CS5 /S
    

    我要做的是向安装人员显示这些选项。我可以很容易地解析/?或者使用${GetParameters}和${GetOptions}的/help参数,但是如何将实际打印到命令提示符?

    1 回复  |  直到 15 年前
        1
  •  9
  •   Anders    15 年前

    NSIS是一个GUI程序,实际上不具备向stdout写入数据的能力。

    在XP和更高版本上,您可以使用系统插件执行此操作:

    System::Call 'kernel32::GetStdHandle(i -11)i.r0' 
    System::Call 'kernel32::AttachConsole(i -1)' 
    FileWrite $0 "hello" 
    

    在<XP上,没有AttachConsole,您需要在这些系统上调用AllocConsole(可能会打开一个新的控制台窗口)

    编辑: 如果父进程中没有

    !include LogicLib.nsh
    System::Call 'kernel32::GetStdHandle(i -11)i.r0' 
    System::Call 'kernel32::AttachConsole(i -1)i.r1' 
    ${If} $0 = 0
    ${OrIf} $1 = 0
     System::Call 'kernel32::AllocConsole()'
     System::Call 'kernel32::GetStdHandle(i -11)i.r0' 
    ${EndIf}
    FileWrite $0 "hello$\n" 
    

    但这真的没有什么意义吗?处理完毕,您最好在没有控制台时打开一个消息框

    !include LogicLib.nsh
    StrCpy $9 "USAGE: Hello world!!" ;the message
    System::Call 'kernel32::GetStdHandle(i -11)i.r0' ;try to get stdout
    System::Call 'kernel32::AttachConsole(i -1)i.r1' ;attach to parent console
    ${If} $0 <> 0
    ${AndIf} $1 <> 0
     FileWrite $0 "$9$\n" 
    ${Else}
     MessageBox mb_iconinformation $9
    ${EndIf}
    
        2
  •  0
  •   JEagle    7 年前
    !include LogicLib.nsh
    StrCpy $9 "USAGE: Hello world!!" ;the message
    System::Call 'kernel32::AttachConsole(i -1)i.r0' ;attach to parent console
    ${If} $0 != 0
     System::Call 'kernel32::GetStdHandle(i -11)i.r0' ;console attached -- get stdout
     FileWrite $0 "$9$\n" 
    ${Else}
     ;no console to attach -- show gui message
     MessageBox mb_iconinformation $9
    ${EndIf}
    

    首先连接控制台,然后获取标准手柄。在连接之前,句柄可能(通常会)无效。