我正在寫一個NSIS安裝記錄了一個很少的外部命令的輸出(見How can I make this function actually work in NSIS?)。不幸的是,當NSIS存儲它吃文字換行輸出,大概是因爲它正在尋找一個字面$ \ -N(我不牛逼居然知道。)
誰能告訴我如何正確地轉換從$ 0換行符下面的代碼片段?
nsExec::ExecToStack '...'
Pop $0
我會將存儲的字符串寫入文件和DetailPrint。
我正在寫一個NSIS安裝記錄了一個很少的外部命令的輸出(見How can I make this function actually work in NSIS?)。不幸的是,當NSIS存儲它吃文字換行輸出,大概是因爲它正在尋找一個字面$ \ -N(我不牛逼居然知道。)
誰能告訴我如何正確地轉換從$ 0換行符下面的代碼片段?
nsExec::ExecToStack '...'
Pop $0
我會將存儲的字符串寫入文件和DetailPrint。
我不相信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}
我希望我理解這個東西:/我」我會試着打破第一個選項。謝謝。如果它有效,將標記爲正確 – 2013-03-18 14:17:04
'DetailPrint'確實吃換行符。你必須用'$ \ n'和'DetailPrint'分隔每一行。不知道爲什麼你看到這一點'FileWrite'雖然... – kichik 2013-03-15 19:09:42
嗯,我用一個函數從安裝日誌,並使用FILEWRITE對於閱讀,所以這就是爲什麼這是發生 – 2013-03-15 23:56:38