#cmd #nsis #silent-installer
#cmd #nsis #silent-installer
Вопрос:
У меня есть требование, чтобы мой автоматический установщик возвращался в командную строку после успешного завершения. В настоящее время лучшее, что я могу сделать, это перейти к мигающему подчеркиванию. Затем я должен вручную нажать клавишу ввода.
Спасибо.
Комментарии:
1. Как насчет того, чтобы показать нам некоторый код? У вас происходит что-то особенное? Вы записываете в стандартный вывод в установщике?
Ответ №1:
Установщики NSIS — это приложения с графическим интерфейсом и 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 trunk и протестирован в cmd.exe на Win8.
Редактировать:
Вы не упомянули, что вы записываете в стандартный вывод из NSIS. Это немного сложно, поскольку установщик не является консольным приложением. Потому что cmd.exe думает, что он запускает приложение с графическим интерфейсом, оно не ждет, а затем, когда приложение с графическим интерфейсом вызывает AttachConsole, в итоге два приложения думают, что они контролируют стандартный вывод, и все больше не работает на 100% правильно.
Если вы выполняете yourapp.exeamp;dir /S /B c:
действия, записанные в стандартный вывод с помощью yourapp.exe будет где-то теряться в выходных данных из dir! В вашем случае приглашение (обычно current-directory >
) фактически печатается, но это происходит раньше 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
, если сможете, инструмент, который может изменить IMAGE_SUBSYSTEM_WINDOWS_GUI на IMAGE_SUBSYSTEM_WINDOWS_CUI в PE-файле…
Комментарии:
1. Спасибо, но этот код просто подает звуковой сигнал 2 раза и по-прежнему оставляет меня с мигающим подчеркиванием…
2. Вот что я делаю: Функция. onInstSuccess !ifdef DebuggingScript StrCpy $R1 «ФУНКЦИЯ onInstSuccess» Вызывает WriteCommandLine !endif IfSilent InstSuccess_SILENT InstSuccess_GUI InstSuccess_SILENT: !ifdef DebuggingScript StrCpy $R1 «ФУНКЦИЯ onInstSuccess_SILENT!!» Вызов WriteCommandLine !endif System::Вызов ‘user32::MessageBeep(i0)’; Sleep 3333 System ::Вызов ‘user32::MessageBeep(0xffffffff)’; Завершение InstSuccess_GUI: FunctrionEnd
3. Извините за вышеуказанный беспорядок… Что случилось с моим форматированием!
4. В любом случае, все, что мне действительно нужно, это вернуться в командную строку после завершения автоматической установки (DOS в моем случае …) C:The установщик dir> Возможно ли это вообще?
5. (что-то, что я нашел где-то в nsis.sourceforge. net некоторое время назад… Функция WriteCommandLine System::Вызов ‘kernel32::GetStdHandle(i -11)i.r0’ System::Вызов ‘kernel32::AttachConsole(i -1)’ Запись файла $0 $ R1 Запись файла $0 $n FunctionEnd
Ответ №2:
Вы вызываете программу установки самостоятельно и хотите дождаться завершения программы установки?
В этом случае вызовите следующее:
start /wait YourInstaller.exe /S