8

単一のプロパティにセミコロンが含まれている場合、MSBuildは、アイテムグループ内で使用されると、プロパティをプロパティのリストに自動的に解析します。これが私のプロジェクトの抜粋です。

 <PropertyGroup>
   <ConnectionString>workstation id=.;packet size=4096;Integrated Security=SSPI;data source=.;initial catalog=$(SqlDbName)</ConnectionString>
 </PropertyGroup>

 <ItemGroup>
   <InstallShieldProperties Include="
       CONNECTIONSTRING=$(ConnectionString);
       Another=$(value)"/>
 </ItemGroup> 

タスクが@(InstallShieldProperties)アイテムグループを消費すると、MSBuildは、セミコロンが含まれているため、ConnectionStringプロパティをサブセットプロパティのリストに解析します。

    foreach (string property in Properties)
    {
      // Properties array parsed to pieces
    }

アイテムグループの区切り文字を変更できることはわかっていますが、違いはありません。カスタムタスク内でstring[]配列を操作しないようにしています。

4

3 に答える 3

11

MSBuild 4.0では、を使用できます$([MSBuild]::Escape($(ConnectionString)))

于 2010-12-07T20:41:26.077 に答える
9

AFAICS、次のように$(ConnectionString)プロパティのセミコロンをエスケープできます。

<ConnectionString>workstation id=.%3Bpacket size=4096%3B.."</ConnectionString>

または、いくつかのタスクを使用して';'を置き換えます ConnectionStringプロパティで'%3B'に設定し、InstallShieldPropertiesアイテムでそのプロパティを使用します。

もう1つの方法は、カスタムタスクのプロパティタイプをstring []からstringに変更してから、必要に応じて自分で分割することです。囲み引用符を使用して、接続文字列部分を他のキーと値のペアから分離できます。

または、カスタムタスクに意味がある場合は、接続文字列は、個別のタスクプロパティとして持つのに十分な特別なプロパティである可能性があります。

于 2009-11-03T07:58:48.283 に答える
9

MSBuild 4.0には、プロパティ関数があります。これらで実行できることの1つは、文字列であるかのように、プロパティで直接.NETStringインスタンスメソッドを呼び出すことです。

あなたの例では、使用する代わりに:

$(ConnectionString)

あなたが使用することができます:

$(ConnectionString.Replace(';', '%3B'))

StringメソッドReplace()を呼び出して、セミコロンを%3Bに置き換えます。

于 2010-09-10T06:34:59.777 に答える