NSIS为什么CopyFiles在一个例子而不是另一个例子中工作?

时间:2016-09-10 20:02:44

标签: installer nsis uninstaller

我在使用CopyFiles命令和从UninstallString注册表中读取的值时遇到了困难。 UninstallString的值为"C:\myapp\uninstall.exe"(带引号)。

如果我尝试以下操作,则无效。

CopyFiles $uninstallPath "C:\Temp" # Does not work

接下来,我编辑注册表并从UninstallString的值中删除引号,使其为C:\myapp\uninstall.exe

以下作品,但不包含引号。

CopyFiles $uninstallPath "C:\Temp" # Works

现在我在变量周围添加引号并且它可以正常工作。

CopyFiles "$uninstallPath" "C:\Temp" # Works

我觉得第一个也是最后一个例子是做同样事情的两种不同方式。为什么第一个例子不起作用的任何清晰度?

1 个答案:

答案 0 :(得分:1)

您正在将苹果与橙子进行比较,或者在您的情况下,将报价与剥离的报价进行比较。

编译器删除.nsi中参数的最外层引号

commit -a

完全相同
public static final double EPSILON = 0.0000000001;
public boolean compare(double a, double b) {
   return Math.abs(a-b) < EPSILON;
}

但是,如果您在用户计算机上的变量中读取字符串,则不会删除任何引号:

StrCpy $0 "Hello World"
MessageBox mb_ok $0

NSIS forum上有一个包含许多不同解决方案的主题。以下是我对这种功能的看法:

StrCpy $0 "Hello World"
MessageBox mb_ok "$0"

在将我的函数复制到.nsi后,您的代码看起来应该是这样的:

StrCpy $0 '"Hello World"' ; Pretending that we read "Hello World" (with quotes) from somewhere
MessageBox mb_ok $0