2010-06-23 11 views
6

estoy haciendo instaladores para Windows utilizando NSIS y tienen una serie de opciones de instalación personalizada que el usuario puede especificar a través de línea de comandos, por ejemplo:NSIS - la impresión para que aparezca en la línea de comandos instalar

installer.exe /IDPATH=c:\Program Files\Adobe\Adobe InDesign CS5 /S 

Lo Lo que quiero hacer es mostrar estas opciones a la persona que está instalando. Puedo analizar fácilmente el /? o/parámetros de ayuda con $ {GetParameters} y $ {GetOptions}, pero ¿cómo hago la impresión real en el símbolo del sistema?

Respuesta

9

NSIS es un programa GUI y realmente no tiene la capacidad de escribir en stdout.

En XP y posteriormente se puede hacer esto con el sistema de plugins:

System::Call 'kernel32::GetStdHandle(i -11)i.r0' 
System::Call 'kernel32::AttachConsole(i -1)' 
FileWrite $0 "hello" 

En < XP, no hay AttachConsole y hay que llamar AllocConsole en esos sistemas (Probablemente abrir una nueva ventana de la consola)

Editar: se podían abrir una nueva consola si el proceso padre no tiene uno ya con

!include LogicLib.nsh 
System::Call 'kernel32::GetStdHandle(i -11)i.r0' 
System::Call 'kernel32::AttachConsole(i -1)i.r1' 
${If} $0 = 0 
${OrIf} $1 = 0 
System::Call 'kernel32::AllocConsole()' 
System::Call 'kernel32::GetStdHandle(i -11)i.r0' 
${EndIf} 
FileWrite $0 "hello$\n" 

Pero en realidad no tiene sentido en cuanto a /? el manejo va, también podría abrir un cuadro de mensaje cuando no hay consola

!include LogicLib.nsh 
StrCpy $9 "USAGE: Hello world!!" ;the message 
System::Call 'kernel32::GetStdHandle(i -11)i.r0' ;try to get stdout 
System::Call 'kernel32::AttachConsole(i -1)i.r1' ;attach to parent console 
${If} $0 <> 0 
${AndIf} $1 <> 0 
FileWrite $0 "$9$\n" 
${Else} 
MessageBox mb_iconinformation $9 
${EndIf} 
+0

Parece que simplemente pegando este código en .oninit no hace nada visible en una máquina con XP. ¿Debo configurar algo, como los valores de i y r0? Tampoco entiendo muy bien lo que hace cada una de estas líneas. Supongo que la primera línea toma el control de la consola actual, la segunda línea vincula $ 0 a esa consola para que las subsiguientes escrituras en ese archivo virtual terminen en la consola. Es esto exacto? También probé las muestras de código más largas que se encuentran en los foros de winamp cuando busco en Google nsis kernel32 :: attachconsole, pero parecen tener el mismo problema. – MatsT

+1

Después de buscar aún más páginas aleatorias creo que he descubierto que toda la 'i' simplemente denota que el siguiente es un número entero. Como puedes ver, mi conocimiento de la API de Windows es muy básico. – MatsT

+0

Necesita ejecutar el programa desde una consola abierta (cmd.exe) – Anders

Cuestiones relacionadas