【问题标题】:NSIS simple copy one file from another folder in program files directory to installation dir not workingNSIS简单地将一个文件从程序文件目录中的另一个文件夹复制到安装目录不起作用
【发布时间】:2014-11-09 16:17:18
【问题描述】:

我尝试创建一个安装程序来安装应用程序。 基本的东西工作正常,但我有问题,当涉及到简单地复制现有文件时,该文件位于 Program Files 文件夹的某个子文件夹中。 这背后的场景是应用程序具有不同的版本和许可证文件。 安装应用程序后,安装程序会查找现有文件,如果存在,则应将该许可证文件复制到 $INSTDIR/license 文件夹。

例子:

 C:\Program Files (x86)\MyApp\Ver1.0\license\   // here's the location of old license file
 C:\Program Files (x86)\MyApp\Ver2.0\license\   // here to put the old license file

以下部分浓缩为相关内容:

Section "License of other Version"
IfFileExists '$PROGRAMFILES\MyApp\Ver1.0\license\some_license.slc' beginLicense endLicense
Goto endLicense
beginLicense:
  MessageBox MB_OK "We have found an old license file. Do you wanna to use it for current installation ?"
  CreateDirectory "$INSTDIR\license"
  CopyFiles "$PROGRAMFILES\MyApp\Ver1.0\license\some_license.slc" $INSTDIR/license/some_license.slc"
endLicense:
    MessageBox MB_OK "There were no license found."
SectionEnd

编译运行良好,但安装过程在尝试复制文件时显示错误。但它没有给出进一步的解释,为什么它失败了。 我也尝试使用 File 指令,但这会产生其他错误,因为使用了 file 指令中的常量(找不到文件,以及那种错误),甚至脚本也无法编译。 我也尝试使用宏,这里在stackoverflow的另一个问题中提到(对不起,没有链接了),但它也对我不起作用。 我在做什么错,是否不允许在 CopyFile 指令中使用常量? 任何帮助表示赞赏。

【问题讨论】:

  • 使用 SysInternals Process Monitor 观察安装程序运行时读取的文件。另请注意,您的引号不正确,斜杠是 / 但应该是 \.
  • 做到了!那个愚蠢的错误,我做到了......你是对的,在将斜杠改为反斜杠之后,它起作用了......非常感谢!

标签: file copy nsis


【解决方案1】:

你需要改变:

CopyFiles "$PROGRAMFILES\MyApp\Ver1.0\license\some_license.slc" $INSTDIR/license/some_license.slc"

收件人:

CopyFiles "$PROGRAMFILES\MyApp\Ver1.0\license\some_license.slc" $INSTDIR\license\some_license.slc"

【讨论】:

  • 第二个参数中缺少双引号
【解决方案2】:

NSIS 不喜欢 / 斜线。虽然大多数低级 kernel32 函数都可以处理它们,但并非 shell 中的所有东西都能处理,这可能包括 CopyFiles 使用的 SHFileOperation。即使不是这样,NSIS 中的内部路径处理也往往会吃掉/ 斜线......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2012-02-15
    • 2013-05-21
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多