我通过属性值是这样的:属性值获取腐败
property1=value1;property2=value2
但有时值包含“;”符号,导致WiX不正确地反序列化属性字符串。我试着用双引号括起数值
property1="value1";property2="value2"
但这并没有帮助。那我该如何处理呢?
我通过属性值是这样的:属性值获取腐败
property1=value1;property2=value2
但有时值包含“;”符号,导致WiX不正确地反序列化属性字符串。我试着用双引号括起数值
property1="value1";property2="value2"
但这并没有帮助。那我该如何处理呢?
在评论中回复to request。要将属性值中的分号加倍,可以使用JScript CA:
<CustomAction Id="DoubleSemiColons" Script="jscript">
<![CDATA[
var s = Session.Property("property2");
var re = /;/g;
var r = s.replace(re, ";;");
Session.Property("property2") = r;
]]>
</CustomAction>
谢谢很多,我已经测试过它,它的工作原理!但你为什么不引用重新变量值?我认为这是一个字符串值,但是当我引用它时,它就停止工作。 – 2011-04-19 14:36:12
@ Bogdan0x400're'不是一个字符串,它是一个正则表达式pattern_,其中'g'是_global_标志来替换's'中所有出现的';',没有它,只有第一次出现的情况会增加一倍。 – 2011-04-19 15:18:43
谢谢你,Alexey – 2011-04-19 15:21:50
我想刚才我们看到这个问题的一天(简短的回答是;;转义)
对于更详细的讨论,如果你想了解如何使用Type 51的自定义操作设置属性由DTF自定义操作反序列化,这样写
var cad = new CustomActionData();
cad.Add("property1","myvalue");
cad.Add("property2","my;value");
Console.WriteLine(cad.ToString());
Console.Read();
一个小控制台应用程序的结果将是:
property1 = myvalue的; property2 =我;;值
这应该有助于您了解如何格式化每种可能的情况。然而,最终你可能会发现自己在51型CA不够的情况下。在这种情况下,您会编写一个不重要的CA来构建您的CustomActionData集合,然后使用Session.DoAction方法来计划延迟CA将CustomActionData传递给它。
在将其传递给我的自定义操作之前,我该如何转义一个属性? – 2011-04-19 07:40:53
@ Bogdan0x400 Christopher提供的例子对你的问题有了答案:如果property的值包含';',那么你必须将它加倍,以便属性值包含';;'。 – 2011-04-19 08:36:36
@Alexey Ivanov例如用户输入一个包含很多的连接字符串;。如何将分号添加到基于文本框输入的属性?是否有内置的自定义操作?我无法在自定义操作中添加分号,因为当我尝试修改该属性时,它会反序列化不正确。 – 2011-04-19 09:49:49
它似乎对我来说工作正常。 – 2011-04-18 15:03:40