代码之家  ›  专栏  ›  技术社区  ›  areum

nsis-如何通过循环复制文件

  •  0
  • areum  · 技术社区  · 7 年前

    我保存了要复制到的文件。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逐行归档,并在循环中复制它,而不是复制我编写的代码。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Anders    7 年前

    (1)

    这个 File 指令不是这样工作的,它不接受变量,因为文件名引用了您正在编译的计算机上的文件。文件被压缩并存储在安装程序中。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