【问题标题】:NSIS - printing to prompt during command line installNSIS - 在命令行安装期间打印提示
【发布时间】:2011-03-07 09:41:00
【问题描述】:

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

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

我想要做的是向安装人员展示这些选项。我可以很容易地解析 /?或带有 ${GetParameters} 和 ${GetOptions} 的 /help 参数,但是如何在命令提示符下进行实际打印?

【问题讨论】:

    标签: nsis command-line-arguments


    【解决方案1】:

    NSIS 是一个 GUI 程序,实际上并没有写入标准输出的能力。

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

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

    编辑: 如果父进程还没有控制台,您可以打开一个新控制台

    !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}
    

    【讨论】:

    • 看起来,简单地将这段代码粘贴到 .oninit 中并不会在 XP 机器上显示任何内容。我是否需要设置任何东西,例如 i 和 r0 的值?我也不太明白这些行的作用。我假设第一行获取当前控制台的句柄,第二行将 $0 链接到该控制台,以便随后对该虚拟文件的写入将在控制台中结束。这是准确的吗?在搜索 nsis kernel32::attachconsole 时,我还尝试了在 winamp 论坛上找到的更长的代码示例,但它们似乎有同样的问题。
    • 在对随机页面进行更多谷歌搜索之后,我想我发现所有的“i”都只是表示以下是一个整数。如您所知,我对 windows api 的了解非常基础。
    • 您需要在打开的控制台 (cmd.exe) 中运行程序
    • 这就是我正在做的。使用 AllocConsole 而不是 AttachConsole 似乎也无济于事。
    • 为我工作。除了它没有关闭。我猜 FileWrite 有一个 fileClose 类型的函数
    【解决方案2】:
    !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}
    

    首先附加控制台,然后获取标准句柄。附加之前的句柄可能(通常会)无效。

    【讨论】:

      猜你喜欢
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 2022-06-22
      相关资源
      最近更新 更多