8 votes

NSIS - impression à l'invite lors de l'installation en ligne de commande

Je crée des programmes d'installation pour Windows à l'aide de NSIS et je dispose d'un certain nombre d'options d'installation personnalisées que l'utilisateur peut spécifier à l'aide de la ligne de commande, par exemple :

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

Ce que je veux faire, c'est montrer ces options à la personne qui procède à l'installation. Je peux facilement analyser les paramètres / ? ou /help avec ${GetParameters} et ${GetOptions}, mais comment faire pour imprimer ces options à l'invite de commande ?

9voto

Anders Points 34448

NSIS est un programme GUI et n'a pas vraiment la possibilité d'écrire sur stdout.

Sous XP et les versions ultérieures, vous pouvez le faire avec le plugin système :

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

Sur < XP, il n'y a pas d'AttachConsole et vous devez appeler AllocConsole sur ces systèmes (cela ouvrira probablement une nouvelle fenêtre de console).

Editer : Vous pouvez ouvrir une nouvelle console si le processus parent n'en a pas déjà une avec

!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" 

Mais cela n'a pas vraiment de sens en ce qui concerne la gestion de / ?, vous pourriez tout aussi bien ouvrir une boîte de message lorsqu'il n'y a pas de console.

!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}

1voto

JEagle Points 46
!include LogicLib.nsh
StrCpy $9 "USAGE: Hello world!!" ;the message
System::Call 'kernel32::AttachConsole(i -1)i.r0' ;attach to parent console
${If} $0 != 0
 System::Call 'kernel32::GetStdHandle(i -11)i.r0' ;console attached -- get stdout
 FileWrite $0 "$9$\n" 
${Else}
 ;no console to attach -- show gui message
 MessageBox mb_iconinformation $9
${EndIf}

Il faut d'abord attacher la console, puis obtenir la poignée std. Avant l'attachement, les handles peuvent (souvent) être invalides.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X