【发布时间】:2014-06-16 15:38:26
【问题描述】:
我的静默安装程序需要在成功完成后返回命令提示符。目前我能做的最好的就是得到一个闪烁的下划线。然后我必须手动按回车键。
谢谢。
【问题讨论】:
-
给我们看一些代码怎么样?你有什么特别的事情吗?您是否在安装程序中写入标准输出?
标签: cmd nsis silent-installer
我的静默安装程序需要在成功完成后返回命令提示符。目前我能做的最好的就是得到一个闪烁的下划线。然后我必须手动按回车键。
谢谢。
【问题讨论】:
标签: cmd nsis silent-installer
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
这个小示例会立即将控制权返回给控制台,而无需按下任何按钮。 (test 和 call test、start /WAIT test 当然会等待)。使用 NSIS 2.46 和 3.0 主干编译并在 Win8 上的 cmd.exe 中测试。
编辑:
您没有提到您正在从 NSIS 写入标准输出。这样做有点麻烦,因为安装程序不是控制台应用程序。因为 cmd.exe 认为它正在运行一个 GUI 应用程序,所以它不会等待,然后当 GUI 应用程序调用 AttachConsole 时,您最终会得到两个应用程序,认为它们可以控制标准输出,并且事情不再 100% 正确运行。
如果你执行yourapp.exe&dir /S /B c:\,你的app.exe 写入stdout 的东西将会在dir 的输出中丢失!在您的情况下,实际上会打印提示(通常是当前目录 + >),但它发生在 yourapp.exe 的输出之前,所以这就是为什么看起来您只是有一个闪烁的光标。
我无法想出一个真正能满足您需求的解决方案:
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 的工具...
【讨论】:
您是自己调用安装程序,是否要等待安装程序完成?
在这种情况下,调用以下代码:
start /wait YourInstaller.exe /S
【讨论】: