静默NSIS安装后如何返回命令提示符

时间:2014-06-16 15:38:26

标签: cmd nsis silent-installer

成功完成后,我要求我的静默安装程序返回命令提示符。目前,我能做的最好的事情是获得一个闪烁的下划线。然后我必须手动点击回车键。

谢谢。

2 个答案:

答案 0 :(得分:0)

NSIS安装程序是GUI应用程序,cmd.exe不应该等待它们。

RequestExecutionLevel user
Outfile "Test.exe"
SilentInstall silent
Name "Test"

Section
System::Call 'user32::MessageBeep(i0)'
Sleep 3333
System::Call 'user32::MessageBeep(i0)'
SectionEnd

这个小样本立即将控制权返回到控制台而无需按任何东西。 (testcall teststart /WAIT test当然都会等待)。使用NSIS 2.46和3.0 trunk编译并在Win8上的cmd.exe中进行测试。

编辑:

您没有提到您正在写信给NSIS的stdout。由于安装程序不是控制台应用程序,因此这样做有点麻烦。因为cmd.exe认为它正在运行一个GUI应用程序,所以它不等待,然后当GUI应用程序调用AttachConsole时,你最终得到两个应用程序,认为它们控制了stdout并且事情不再正常工作。

如果执行yourapp.exe&dir /S /B c:\,yourapp.exe写入stdout的内容将在dir的输出中丢失!在你的情况下,提示符(通常是当前目录+ >)实际上是打印的,但它在yourapp.exe的输出之前发生,这就是为什么它看起来像你只是一个闪烁的光标。 / p>

无法想出一个实际上做你想要的解决方案:

SilentInstall silent

Function WriteCommandLine 
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
System::Call 'kernel32::AttachConsole(i -1)'
StrCmp $0 0 "" +2
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $0 $R1
FileWrite $0 $\n
/* Does not work: 
System::Call 'kernel32::FreeConsole()'
*/
/* This ugly hack does not work:
ExpandEnvStrings $0 "%COMSPEC%"
StrCmp $0 "" "" +2
StrCpy $0 cmd.exe
Exec '"$0" /c prompt' 
*/
FunctionEnd

Function .onInit
strcpy $R1 "Hello World"
call WriteCommandLine
FunctionEnd

如果您的安装程序始终处于静音状态,则可以使用!packhdr,如果您可以找到可以在PE文件中将IMAGE_SUBSYSTEM_WINDOWS_GUI更改为IMAGE_SUBSYSTEM_WINDOWS_CUI的工具...

答案 1 :(得分:0)

您是否自己调用安装程序,是否要等待安装程序完成?

在这种情况下,请致电以下人员:

start /wait YourInstaller.exe /S
相关问题