如何在NSIS中将文字换行符转换为$\n?
我正在编写一个NSIS安装程序,它记录一些外部命令的输出(请参阅)。不幸的是,当NSIS存储输出时,它会吃文字换行符,可能是因为它正在查找文字$\n(我实际上不知道) 有人能告诉我如何正确地转换以下代码段中$0的换行符吗如何在NSIS中将文字换行符转换为$\n?,nsis,Nsis,我正在编写一个NSIS安装程序,它记录一些外部命令的输出(请参阅)。不幸的是,当NSIS存储输出时,它会吃文字换行符,可能是因为它正在查找文字$\n(我实际上不知道) 有人能告诉我如何正确地转换以下代码段中$0的换行符吗 nsExec::ExecToStack '...' Pop $0 我将用DetailPrint将存储的字符串写入文件。我不相信ExecToStack会吃换行符,但它仅限于${NSIS_MAX_STRLEN}的输出 具有/TOFUNC参数,可以为每行调用NSIS函数 或者您可以
nsExec::ExecToStack '...'
Pop $0
我将用DetailPrint将存储的字符串写入文件。我不相信ExecToStack会吃换行符,但它仅限于${NSIS_MAX_STRLEN}的输出 具有/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}
!包括LogicLib.nsh
!包括WinMessages.nsh
!ifndef LVM_GETITEM
!如果不首先使用LVM_
!首先定义LVM_0x00001000
!恩迪夫
!define/math LVM_GETITEMCOUNT${LVM_FIRST}+4
!ifndef NSIS_UNICODE
!define/math LVM_GETITEM${LVM_FIRST}+5
!其他的
!define/math LVM_GETITEM${LVM_FIRST}+75
!恩迪夫
!恩迪夫
FindWindow$9“#32770”“”$HWNDPARENT
GetDlgItem$9$9 0x3F8
SendMessage$9${LVM_GETITEMCOUNT}0$7
nsExec::执行日志“ping-n 2 localhost”
流行音乐$0
${If}$0!=“错误”
!定义MAXEXECLINE 5000
系统::调用“*(i,i,i,i,i,i,i,i,&t${maxecline})i.r6”
IntOp$8$6+36
系统::调用“*$6(i,i,i,i,i,ir8,i${maxecline},i,i)”
SendMessage$9${LVM_GETITEMCOUNT}0$8
${DoWhile}$7<$8
推6美元
推7美元
推8美元
推9美元
系统::调用“*$6(i1,i$7,i0)”
SendMessage$9${LVM_GETITEM}0$6
系统::调用“*$6(i,i,i,i,i,t.r7)”;(i,i,i,i,i,i,i,i,i,i,&t${maxecline}.r7)'
推7美元
称为nsExecLine;在这种情况下,nsExecLine不应详细打印。。。
流行音乐9美元
流行音乐8美元
流行音乐7美元
流行音乐6美元
IntOp$7$7+1
${Loop}
系统::免费6美元
${EndIf}
DetailPrint
不吃换行符。您必须按$\n
和DetailPrint
每行进行拆分。不知道为什么你会在FileWrite
中看到这一点……我正在使用一个函数从安装日志中读取并使用FileWrite,所以这就是为什么会发生这种情况。我希望我能理解这一点:/我会尝试在中修改第一个选项。谢谢如果有效,将标记为正确