2012-04-18 57 views
1

相關問題here間隔路徑,msbuild和psake

這適用於編譯mvc3應用程序。

task Compile 
{ 
    $config = $script:siteConfig.config 

    exec { & "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" $webproject_path ` 
    /p:Configuration=$config /p:WebProjectOutputDir="$publish_dir" ` 
    /p:Outdir="$out_dir" /p:CleanWebProjectOutputDir=False ` 
    /T:_WPPCopyWebApplication /T:ResolveReferences /verbosity:quiet /nologo } 
} 

所有這些路徑變量都是腳本屬性。但是,如果在這些計算路徑中引入了空格(例如項目從C:\ Projects \移動到C:\ Users \ ASDFG1 \ Documents \ Visual Studio 2010 \ Projects),msbuild認爲有多個項目文件。這是有道理的,但我必須失去一些東西,得到一個分析變量爲引號不應該這麼難。

變化試圖

exec { Invoke-Expression "& C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe '$webproject_path' /p:Configuration=$config /p:WebProjectOutputDir='$publish_dir' /p:Outdir='$out_dir' /p:CleanWebProjectOutputDir=False /T:_WPPCopyWebApplication /T:ResolveReferences /verbosity:quiet /nologo" } 

exec { C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe "`"$webproject_path`"" ` 
/p:Configuration=$config /p:WebProjectOutputDir="`"$publish_dir`"" ` 
/p:Outdir="`"$out_dir`"" /p:CleanWebProjectOutputDir=False ` 
/T:_WPPCopyWebApplication /T:ResolveReferences /verbosity:quiet /nologo } 
+3

只是一個建議:調用表達式是很少在一個不錯的選擇運行命令和應用程序。 – Joey 2012-04-18 16:54:05

+0

謝謝,能否詳細說明一下?我正在盡一切可能使其工作,但會想知道你的邏輯。 – 2012-04-18 17:04:19

+2

這通常是問題所在。 PowerShell對本機命令的參數處理在某些時候有點奇怪,而且人們通常會嘗試任何他們能想到的方法來使其工作,而且經常會有「Invoke-Expression」潛入其中。關鍵是Invoke-Expression不會改變任何有關該命令運行,它只是增加了一個間接的層,有時會引發自己的問題。除非在運行時真正構建PowerShell命令才能執行,否則最好避免使用Invoke-Expression。 – Joey 2012-04-18 17:11:58

回答

0

使用EchoArgs.exe重現該問題,我們看到的報價沒有被傳遞到可執行文件所需:

PS> $publish_dir = 'C:\Users\Documents\Visual Studio 2010\Projects' 
PS> ./echoargs /p:WebProjectOutputDir="$publish_dir" 
Arg 0 is </p:WebProjectOutputDir=C:\Users\Documents\Visual Studio 2010\Projects> 

PS> ./echoargs /p:WebProjectOutputDir="`"$publish_dir`"" 
Arg 0 is </p:WebProjectOutputDir=C:\Users\Documents\Visual> 
Arg 1 is <Studio> 
Arg 2 is <2010\Projects> 


使用反斜槓 - 從this answer的轉義選項,我們可以保留變量擴展和enclo唱報價:

PS> ./echoargs /p:WebProjectOutputDir=\`"$publish_dir\`" 
Arg 0 is </p:WebProjectOutputDir="C:\Users\Documents\Visual Studio 2010\Projects"> 

這裏,反引號告訴PowerShell來對待引號字符爲文字值,和反斜線告訴調用調用保存的報價。


另外,我們可以用逃避的一個級別堅持通過事先評估的充分論證,而不是內聯$publish_dir變量:

PS> $publishArg = '/p:WebProjectOutputDir=\"{0}\"' -f $publish_dir 
PS> ./echoargs $publishArg 
Arg 0 is </p:WebProjectOutputDir="C:\Users\Documents\Visual Studio 2010\Projects">