2011-04-18 57 views
0

我通过属性值是这样的:属性值获取腐败

property1=value1;property2=value2 

但有时值包含“;”符号,导致WiX不正确地反序列化属性字符串。我试着用双引号括起数值

property1="value1";property2="value2" 

但这并没有帮助。那我该如何处理呢?

+0

它似乎对我来说工作正常。 – 2011-04-18 15:03:40

回答

1

在评论中回复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> 
+0

谢谢很多,我已经测试过它,它的工作原理!但你为什么不引用重新变量值?我认为这是一个字符串值,但是当我引用它时,它就停止工作。 – 2011-04-19 14:36:12

+1

@ Bogdan0x400're'不是一个字符串,它是一个正则表达式pattern_,其中'g'是_global_标志来替换's'中所有出现的';',没有它,只有第一次出现的情况会增加一倍。 – 2011-04-19 15:18:43

+0

谢谢你,Alexey – 2011-04-19 15:21:50

3

我想刚才我们看到这个问题的一天(简短的回答是;;转义)

对于更详细的讨论,如果你想了解如何使用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传递给它。

+0

在将其传递给我的自定义操作之前,我该如何转义一个属性? – 2011-04-19 07:40:53

+0

@ Bogdan0x400 Christopher提供的例子对你的问题有了答案:如果property的值包含';',那么你必须将它加倍,以便属性值包含';;'。 – 2011-04-19 08:36:36

+0

@Alexey Ivanov例如用户输入一个包含很多的连接字符串;。如何将分号添加到基于文本框输入的属性?是否有内置的自定义操作?我无法在自定义操作中添加分号,因为当我尝试修改该属性时,它会反序列化不正确。 – 2011-04-19 09:49:49