NSIS-在命令行安装期间打印到提示符
我正在使用NSIS为windows制作安装程序,并且有许多用户可以使用命令行指定的自定义安装选项,例如: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和更高版本上,您可以使用系统插件
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}