【问题标题】:How to return to command prompt after a silent NSIS install静默 NSIS 安装后如何返回命令提示符
【发布时间】:2014-06-16 15:38:26
【问题描述】:

我的静默安装程序需要在成功完成后返回命令提示符。目前我能做的最好的就是得到一个闪烁的下划线。然后我必须手动按回车键。

谢谢。

【问题讨论】:

  • 给我们看一些代码怎么样?你有什么特别的事情吗?您是否在安装程序中写入标准输出?

标签: cmd nsis silent-installer


【解决方案1】:

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 主干编译并在 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 的工具...

【讨论】:

  • 谢谢,但该代码只会发出 2 次哔哔声,但下划线仍然闪烁...
  • 这是我正在做的事情: Function .onInstSuccess !ifdef DebuggingScript StrCpy $R1 "FUNCTION onInstSuccess" Call WriteCommandLine !endif IfSilent InstSuccess_SILENT InstSuccess_GUI InstSuccess_SILENT: !ifdef DebuggingScript StrCpy $R1 "FUNCTION onInstSuccess_SILENT!!"调用 WriteCommandLine !endif System::Call 'user32::MessageBeep(i0)';睡眠 3333 System::Call 'user32::MessageBeep(0xffffffff)';退出 InstSuccess_GUI: FunctionEnd
  • 对上面的混乱感到抱歉...我的格式出了什么问题!
  • 无论如何,我真正需要的是在完成静默安装后返回命令提示符(在我的情况下是 DOS...) C:\The installer dir> 有可能吗?跨度>
  • (前段时间我在 nsis.sourceforge.net 上某处发现的东西... Function WriteCommandLine System::Call 'kernel32::GetStdHandle(i -11)i.r0' System::Call ' kernel32::AttachConsole(i -1)' FileWrite $0 $R1 FileWrite $0 $\n FunctionEnd
【解决方案2】:

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

在这种情况下,调用以下代码:

start /wait YourInstaller.exe /S

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多