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

NSIS-在命令行安装期间打印到提示符,nsis,command-line-arguments,Nsis,Command Line Arguments,我正在使用NSIS为windows制作安装程序,并且有许多用户可以使用命令行指定的自定义安装选项,例如: installer.exe /IDPATH=c:\Program Files\Adobe\Adobe InDesign CS5 /S 我要做的是向安装人员显示这些选项。我可以很容易地解析/?或使用${GetParameters}和${GetOptions}设置/help参数,但如何实际打印到命令提示符?NSIS是一个GUI程序,实际上无法写入标准输出 在XP和更高版本上,您可以使用系统插件

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

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

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

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}
!包括LogicLib.nsh
StrCpy$9“用法:你好,世界!!”;信息
系统::调用'kernel32::GetStdHandle(i-11)i.r0';试着去买些糖果
系统::调用'kernel32::AttachConsole(i-1)i.r1';附加到父控制台
${If}$0
${AndIf}$1 0
文件写入$0“$9$\n”
${Else}
MessageBox mb_图标信息$9
${EndIf}

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

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