user
user

Reputation: 393

How do I redirect the output of commands to file in silent mode in NSIS?

In GUI mode, commands like CopyFiles , Delete , etc. output their data to GUI (may be using DetailPrint) and their is a function available on NSIS forums to copy that data (at the end of section) to a file.

Queries:

  1. If the installer is being run in silent mode, how do I get the same data (which was being directed to GUI in non-silent mode) to the file?

  2. In GUI mode, since I am directing custom logs through DetailPrint to the log file with the help of function so that all the logs are received in order. Here the issue is that line breaks are removed from the custom logs. May be DetailPrint removes it. How shall I avoid this?

    Example:

    DetailPrint "This is a custom log1"
    DetailPrint "$\r$\nThis is a custom log2"
    /* 
      Dumped these logs using function mentioned above
      Output in logs(with no line breaks):
      This is a custom log1
      This is a custom log2
    
      Required output:
      This is a custom log1
    
      This is a custom log2
    */
    

Upvotes: 1

Views: 960

Answers (1)

Jaimesh
Jaimesh

Reputation: 851

Your Second query is Solved.

!include "MUI2.nsh"
section
StrCpy $0 "$EXEDIR\install.log"
Push $0
    DetailPrint "This is a custom log1"
    DetailPrint "This is a custom log2"
    Call DumpLog
sectionend

;!define LVM_GETITEMCOUNT 0x1004
!define LVM_GETITEMTEXT 0x102D

Function DumpLog
  Exch $5
  Push $0
  Push $1
  Push $2
  Push $3
  Push $4
  Push $6

  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1016
  StrCmp $0 0 exit
  FileOpen $5 $5 "w"
  StrCmp $5 "" exit
    SendMessage $0 ${LVM_GETITEMCOUNT} 0 0 $6
    System::Alloc ${NSIS_MAX_STRLEN}
    Pop $3
    StrCpy $2 0
    System::Call "*(i, i, i, i, i, i, i, i, i) i \
      (0, 0, 0, 0, 0, r3, ${NSIS_MAX_STRLEN}) .r1"
    loop: StrCmp $2 $6 done
      System::Call "User32::SendMessageA(i, i, i, i) i \
        ($0, ${LVM_GETITEMTEXT}, $2, r1)"
      System::Call "*$3(&t${NSIS_MAX_STRLEN} .r4)"
      FileWrite $5 "$4$\r$\n"
      FileWrite $5  "$\r$\n"
      IntOp $2 $2 + 1
      Goto loop
    done:
      FileClose $5
      System::Free $1
      System::Free $3
  exit:
    Pop $6
    Pop $4
    Pop $3
    Pop $2
    Pop $1
    Pop $0
    Exch $5
FunctionEnd

Your sample code is works for me. Its gives me output as your requirement. Dont put "$\r$\n" in Detailprint. Add FileWrite $5 "$\r$\n" in DumpLog function as i did. By this you will not have to put $\r$\n in each detail print.

Upvotes: 1

Related Questions