2012-08-16 66 views
10

MSBuildにプロパティを渡そうとしています。このプロパティはセミコロンで区切られた値のリストです。 this questionとは異なり、私はPowerShellからMSBuildを実行しています。PowerBuilderからコマンドラインを実行するときに、MSBuildコマンドラインにセミコロンを含むプロパティ値を渡すにはどうすればよいですか?

私が取得:

PS> msbuild .\Foo.sln /p:PackageSources="\\server\NuGet;E:\NuGet" 

MSBUILD : error MSB1006: Property is not valid. 
Switch: E:\NuGet 

私はコマンドプロンプトから同じコマンドを実行すると、それが正常に動作します。 PowerShellでどのように動作させるには?単一引用符で

+0

セミコロンの前にバックスティックのエスケープ文字(" ")を使用してみてください。おそらく、その文字列内の他の文字も同様です。 – David

+2

Backtickが機能しません - 問題はMSBuildが/ p:PropA = ValA; PropB = ValBを想定していることです。セミコロンはPowerBuilderからではなく、MSBuildから「エスケープ」する必要があります。引用符を追加するとこれを修正するはずですが、PoShはコマンドラインを渡すときに引用符を引いてしまいます。 –

答えて

17

ラップパラメータ:PowerShellのオン

... '/p:PackageSources="\\Server\NuGet;E:\NuGet"' 

はこれを試してくださいv3は:

msbuild .\Foo.sln --% /p:PackageSources="\\Server\NuGet;E:\NuGet" 
+0

v3を確認できません(フォント、色、サイズなどのPowerShellコンソール設定が破損したときにアンインストールしましたが、余分な一重引用符が機能します)。 –

-1

VBScriptの以下の機能がからMSBuild.exeに渡されたプロパティ値をエスケープするために使用することができ二重引用符で囲んで:

Function Escape(s) 
     Escape = s 

     Set objRegEx = CreateObject("VBScript.RegExp") 

     objRegEx.Global = True 
     objRegEx.Pattern = "(\\+)?""" 

     Escape = objRegEx.Replace(Escape,"$1$1\""") 

     objRegEx.Pattern = "(\\+)$" 

     Escape = objRegEx.Replace(Escape,"$1$1") 
    End Function 

次の例では、エスケープ()機能の使用が

Set objShell = WScript.CreateObject("WScript.Shell")   
    objShell.Run "msbuild.exe echo.targets /p:Param1=""" & Escape("ParamValue1") & """,Param2=""" & Escape("ParamValue1") & """", 1, True 
+0

あなたはこの回答が生きることができる質問を(そして自己回答)する必要があります。 PowerShellとは何の関係もありません。 –

0

また、使用してASCII値が役立つかもしれません示しています。

のMSBuildを\ Foo.sln/P:PackageSources = "\サーバー\ NuGet%3BE :\ NuGet "

+0

こんにちは、あなたはかなり古い質問に答えています。あなたの答えが、まだ提供されているものよりも優れている理由を詳しく説明できますか? –

+2

この場合、スクリプトを変更する必要はありませんが、それは唯一の違いです。それは実際に私の問題でした - 私はビルドを引き起こした配布プラグインを使用していました。私はプラグインのコードに触れることが許されていなかったので、より適切に解決されました。 –

+0

クール!次回は、そのテキストをあなたの投稿(編集)に直接追加して、将来の読者のために見つけることができます。あなたはまだそれを行うことができます(私はそれをお勧めしたい)。 –

関連する問題