複数の値を持つ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&#174%3B Product" />
<OtherProperty Include="foo" />
</ItemGroup>
<Exec Command="msbuild.exe subBuildScript.proj /p:DefineConstants="MyProductName=@(MyProductName);OtherVar=@(foo);AnotherVar=asdf;" " />
</Target>
</Project>
上記を実行すると、コマンドラインが生成されます。
msbuild.exe subBuildScript.proj /p:DefineConstants="MyProductName=Trademarked® Product;OtherVar=foo;AnotherVar=asdf;"
これは、セミコロンで分割された製品名で定数を定義することになります。
MyProductName=Trademarked®
Product
OtherVar=foo
AnotherVar=asdf
注:パーセント記号に%25を使用してみました。
<MyProductName Include="Trademarked&#174%253B Product" />
しかし、それは私に与えます:
MyProductName=Trademarked®B 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の値をエスケープ解除します。