2014-06-16 2 views
0

성공적으로 완료 한 후 자동 설치 관리자가 명령 프롬프트로 돌아 가기위한 요구 사항이 있습니다. 현재 내가 할 수있는 최선은 깜박이는 밑줄을 얻는 것입니다. 수동으로 Enter 키를 눌러야합니다.자동 NSIS 설치 후 명령 프롬프트로 돌아 오는 방법

감사합니다.

+0

어떻게 우리에게 몇 가지 코드를 보여주는 어떻습니까? 특별한 일이 있으십니까? 설치 프로그램에서 stdout에 쓰고 있습니까? – Anders

답변

0

NSIS 설치 프로그램은 GUI 응용 프로그램이며 cmd.exe는 GUI 응용 프로그램을 기다리지 않아야합니다.

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

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

이 작은 샘플은 아무 것도 누르지 않고도 즉시 컨트롤을 콘솔로 반환합니다. (testcall test, start /WAIT test은 물론 대기합니다.) NSIS 2.46 및 3.0 트렁크로 컴파일되고 Win8의 cmd.exe에서 테스트되었습니다.

편집 :

당신은 당신이 NSIS에서 stdout에 작성 언급하지 못했습니다. 그렇게하는 것은 설치 프로그램이 콘솔 응용 프로그램이 아니기 때문에 약간 해킹됩니다. cmd.exe는 GUI 응용 프로그램을 실행하고 있다고 생각하기 때문에 기다리지 않고 GUI 응용 프로그램이 AttachConsole을 호출하면 두 응용 프로그램이 stdout을 제어한다고 생각하고 결국 100 % 제대로 작동하지 않게됩니다.

yourapp.exe&dir /S /B c:\을 실행하면 yourapp.exe가 stdout에 작성한 내용이 dir의 출력에서 ​​어딘가에서 손실 될 것입니다! 귀하의 경우 프롬프트 (일반적으로 current-directory + >)가 실제로 인쇄되지만 Yourapp.exe의 출력 전에 발생하므로 커서가 깜박이는 것처럼 보입니다. 당신의 설치 당신이 IMAGE_SUBSYSTEM_WINDOWS_GUI을 변경할 수있는 도구를 찾을 수 있다면 당신은 !packhdr을 사용할 수 항상 침묵

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 

경우

내가없는은 실제로 당신이 원하는 것을 그 해결책을 마련 했다 PE 파일의 IMAGE_SUBSYSTEM_WINDOWS_CUI ...

+0

은 감사하지만, 그 코드는 2 배 경고음이 여전히 깜박 밑줄 ... 여기 –

+0

내가 뭐하는 거지입니다 날 나뭇잎! 기능 .onInstSuccess DebuggingScript IFDEF strcpy를 $ R1 '기능 onInstSuccess " 전화 WriteCommandLine ENDIF IfSilent InstSuccess_SILENT InstSuccess_GUI InstSuccess_SILENT : ! ifdef 디버깅 스크립트 StrCpy $ R1 "FUNCTION onInstSuccess_SILENT !!" 호출 WriteCommandLine ! endif System :: Call 'user32 :: MessageBeep (i0)'; Sleep 3333 System :: Call 'user32 :: MessageBeep (0xffffffff)'; 종료 InstSuccess_GUI : FunctrionEnd –

+0

위의 혼란에 대한 사과 ... 내 서식이 어떻게 되었습니까! –

0

설치 프로그램을 직접 호출하고 설치 프로그램이 완료 될 때까지 기다리시겠습니까? 이 경우

다음 전화 :

start /wait YourInstaller.exe /S