我将要复制的文件保存到.dat文件中,如下所示。
\Bin\a.exe
\Bin\b.dll
\Bin\c.dll
\Bin\d.dll
\Bin\e.dll
\Bin\f.dll
然后我想逐行读取.dat文件。 我按行阅读下面的代码(.nsi)。
ClearErrors
FileOpen $0 "CopyFileList.dat" r
loop:
FileRead $0 $1
Strcmp $1 "" done
StrCpy $varBinFileName $1
File /r "${TARGETDIR}\$varBinFileName"
goto loop
done:
FileClose $0
然后出现两个问题!!
1)读取变量本身的名称,而不是变量$ varBinFileName的存储值。
所以,即使文件在那里,
找不到该文件,因为它不是文件名。
2)读取.dat文件时,“||”被添加。
例如,阅读第一行会产生以下结果:\Bin\a.exe||
我想得到删除“||”的结果在复制文件时使用它。
如果有更好的方法逐行读取.dat文件并将其复制到循环而不是我写的代码,请告诉我。
答案 0 :(得分:1)
<强> 1)强>
File
指令不起作用,它不接受变量,因为文件名是指您正在编译的机器上的文件。该文件被压缩并存储在setup .exe中。使用CopyFiles
指令复制最终用户系统上已有的文件。
要有条件地提取你需要写的东西:
!include LogicLib.nsh
Section
SetOutPath $InstDir
${If} $myvar == "something.ext"
File "something.ext"
${Else}
File "somethingelse.ext"
${EndIf}
SectionEnd
<强> 2)强>
FileRead
包含换行符(如果有),您必须删除它们:
; Write example file
FileOpen $0 "$temp\nsistest.txt" w
FileWrite $0 "hello$\r$\n"
FileWrite $0 "world$\r$\n"
FileClose $0
; Parse file
FileOpen $0 "$temp\nsistest.txt" r
loop:
FileRead $0 $1
StrCmp $1 "" done
StrCpy $2 $1 "" -1 ; Copy last character
StrCmp $2 '$\r' +2
StrCmp $2 '$\n' +1 +3
StrCpy $1 $1 -1 ; Remove newline
Goto -4 ; ...and check the end again
DetailPrint line=$1
Goto loop
done:
FileClose $0