2013-03-15 56 views
1

我正在寫一個NSIS安裝記錄了一個很少的外部命令的輸出(見How can I make this function actually work in NSIS?)。不幸的是,當NSIS存儲它吃文字換行輸出,大概是因爲它正在尋找一個字面$ \ -N(我不牛逼居然知道。)

誰能告訴我如何正確地轉換從$ 0換行符下面的代碼片段?

nsExec::ExecToStack '...' 
Pop $0 

我會將存儲的字符串寫入文件和DetailPrint。

+0

'DetailPrint'確實吃換行符。你必須用'$ \ n'和'DetailPrint'分隔每一行。不知道爲什麼你看到這一點'FileWrite'雖然... – kichik 2013-03-15 19:09:42

+0

嗯,我用一個函數從安裝日誌,並使用FILEWRITE對於閱讀,所以這就是爲什麼這是發生 – 2013-03-15 23:56:38

回答

2

我不相信ExecToStack吃換行符,但也僅限於$ {} NSIS_MAX_STRLEN輸出。

ExecDos plug-in具有/ TOFUNC參數,可以調用在各行中NSIS功能。

或者你可以分析它自己:

Function nsExecLine 
Pop $0 
DetailPrint Line|$0| 
; FileWrite ... 
FunctionEnd 



!include LogicLib.nsh 
nsExec::ExecToStack 'ping -n 2 localhost' 
Pop $0 
${If} $0 != "error" 
    Pop $0 
    StrCpy $1 -1 
    StrCpy $3 "" ; \r \n merge 
    more: 
     IntOp $1 $1 + 1 
     StrCpy $2 $0 1 $1 
     StrCmp $2 "" done ; Can also be printlast if desired 
     StrCmp $2 "$\n" +2 
     StrCmp $2 "$\r" +1 more 
     StrCpy $2 $0 $1 
     StrCpy $4 $0 1 $1 
     StrCmp $3 "" +2 
     StrCmp $3 $4 0 more 
     StrCpy $3 $4 
     IntOp $1 $1 + 1 
    ;printlast: 
     StrCpy $0 $0 "" $1 
     Push $0 
     Push $3 
     Push $2 
     Call nsExecLine 
     Pop $3 
     Pop $0 
     StrCpy $1 -1 
     StrCmp $0 "" +1 more 
    done: 
${EndIf} 

...或者作爲一個黑客位的,使用ExecToLog:

!include LogicLib.nsh 
!include WinMessages.nsh 
!ifndef LVM_GETITEM 
!ifndef LVM_FIRST 
!define LVM_FIRST 0x00001000 
!endif 
!define /math LVM_GETITEMCOUNT ${LVM_FIRST} + 4 
!ifndef NSIS_UNICODE 
!define /math LVM_GETITEM ${LVM_FIRST} + 5 
!else 
!define /math LVM_GETITEM ${LVM_FIRST} + 75 
!endif 
!endif 
FindWindow $9 "#32770" "" $HWNDPARENT 
GetDlgItem $9 $9 0x3F8 
SendMessage $9 ${LVM_GETITEMCOUNT} 0 0 $7 
nsExec::ExecToLog 'ping -n 2 localhost' 
Pop $0 
${If} $0 != "error" 
    !define MAXEXECLINE 5000 
    System::Call '*(i,i,i,i,i,i,i,i,i,&t${MAXEXECLINE})i.r6' 
    IntOp $8 $6 + 36 
    System::Call '*$6(i,i,i,i,i,ir8,i${MAXEXECLINE},i,i)' 
    SendMessage $9 ${LVM_GETITEMCOUNT} 0 0 $8 
    ${DoWhile} $7 < $8 
     Push $6 
     Push $7 
     Push $8 
     Push $9 
     System::Call '*$6(i1,i$7,i0)' 
     SendMessage $9 ${LVM_GETITEM} 0 $6 
     System::Call '*$6(i,i,i,i,i,t.r7)' ; (i,i,i,i,i,i,i,i,i,&t${MAXEXECLINE} .r7)' 
     Push $7 
     Call nsExecLine ; nsExecLine should not DetailPrint in this case... 
     Pop $9 
     Pop $8 
     Pop $7 
     Pop $6 
     IntOp $7 $7 + 1 
    ${Loop} 
    System::Free $6 
${EndIf} 
+0

我希望我理解這個東西:/我」我會試着打破第一個選項。謝謝。如果它有效,將標記爲正確 – 2013-03-18 14:17:04

相關問題