1

複数の値を持つDefineConstantsプロパティを含む別のMSBuildコマンドを開始するためにExecタグを使用するmsbuildスクリプトがあります。そのプロパティには複数の値があるため、この質問で説明されている手法を使用して、 MSBuild.exeを直接呼び出し(MSBuildタグを使用しない)、値を引用符で囲みます。

¯ただし、これらの値の1つに特別な記号を埋め込む必要があります。これは、コード(登録商標®)を使用して実行しようとしています。

問題は、特殊文字コードがセミコロンで終わる必要があることですが、セミコロンを埋め込むと、msbuildはそれを値の区切り文字として読み取ります。セミコロンをエスケープして、それを終了パラメーター値に表示させる有効な方法を見つけたようです。

私の質問はこれです:ビルドパラメータに特別な文字を埋め込むにはどうすればよいですか?

読みやすさを向上させるために、この例では値を変数に移動しましたが、これは必須ではありません。

ファイル:TopLevelBuildScript.proj

  <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="BuildWithSpecialChar">
    <ItemGroup>
      <!-- Note: %3B is the escape code for semicolon -->
      <MyProductName Include="Trademarked&amp;#174%3B Product" />
      <OtherProperty Include="foo" />
    </ItemGroup>

   <Exec Command="msbuild.exe subBuildScript.proj /p:DefineConstants=&quot;MyProductName=@(MyProductName);OtherVar=@(foo);AnotherVar=asdf;&quot; " />
    </Target>
  </Project>

上記を実行すると、コマンドラインが生成されます。

msbuild.exe subBuildScript.proj /p:DefineConstants="MyProductName=Trademarked&#174; Product;OtherVar=foo;AnotherVar=asdf;"

これは、セミコロンで分割された製品名で定数を定義することになります。

MyProductName=Trademarked&#174
Product
OtherVar=foo
AnotherVar=asdf

注:パーセント記号に%25を使用してみました。

<MyProductName Include="Trademarked&amp;#174%253B Product" />

しかし、それは私に与えます:

MyProductName=Trademarked&#174B Product
OtherVar=foo  
AnotherVar=asdf

アップデート

問題はMSBuildにあるのではなく、WiXがパラメーターを解析する方法にあることがわかりました(私のsubBuildScriptはWiXを利用しています)。私はそれを考慮していなかったので、私の元の投稿ではそれについて言及しませんでした。

最終的に、私は別の質問に対するこの回答に基づいた解決策を採用しました:

<PropertyGroup>   
  <WixValues>
    <MyProductName>Trademarked® Product<MyProductName>
    <OtherProperty>foo"</OtherProperty>
  </WixValues>
</PropertyGroup>
<MSBuild
    Projects="subProjectScript.proj"
    Properties="Configuration=Release;WixValues=$([MSBuild]::Escape($(WixValues)))"
    Targets="Clean;Rebuild"
    ContinueOnError="false"
    StopOnFirstFailure="true">
</MSBuild>

他の回答で説明されているように、subProjectScript.projの値をエスケープ解除します。

4

1 に答える 1

1

まず、MSBuildファイルはXMLであり、UTF-8としてエンコードできるため、エスケープせずに商標文字をMSBuildスクリプトに直接コピーして貼り付けることができるはずです。

そのアプローチをとることができない場合は、アンパサンドを逃がさないでください。MSBuildスクリプトには、2つのレベルのエスケープがあります。1つ目はXMLエンコーディングです。これにより、XMLに依存する文字(<および&)を使用でき、安全なXMLを維持できます。MSBuildがファイルを読み込むと、XMLエスケープシーケンスはエスケープ解除されます。そのプロセスの後、MSBuildは独自のエスケープ解除を実行します(つまり%3B、セミコロンの場合)。

&amp;XMlエスケープシーケンスの最初に使用しているため、XMLプロセッサは、エスケープシーケンスを示す特別なXMLアンパサンドではなく、リテラルのアンパサンドとして解釈しています。MyProductNameアイテムグループの値を次のように変更します。

<MyProductName Include="Trademarked&#174; Product" />

MyProductNameリストではなくスカラー値のように見えるので、代わりにプロパティを使用します。

<PropertyGroup>
  <MyProductName>Trademarked® Product</MyProductName>
</PropertyGroup>

Execタスクでは、次のように使用できます。

<Exec Command="msbuild.exe subBuildScript.proj /p:DefineConstants=&quot;MyProductName=$(MyProductName);OtherVar=@(foo);AnotherVar=asdf;&quot; " />
于 2012-09-11T03:08:09.247 に答える