2011-04-18 56 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