从PowerShell运行MSBuild时,如何在命令行上传递包含分号的属性值?

r9f1avp5  于 2023-03-02  发布在  Shell
关注(0)|答案(3)|浏览(133)

我正在尝试将属性传递给MSBuild。该属性是以分号分隔的值列表。与this question不同,我是从PowerShell运行MSBuild的。
我得到:

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

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

如果我从命令提示符运行相同的命令,它工作正常。我如何让它在PowerShell中工作?

exdqitrt

exdqitrt1#

将参数括在单引号中:

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

在PowerShell v3上尝试以下操作:

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

flmtquvp2#

此外,使用ASCIII值有助于:

msbuild .\Foo.sln /p:PackageSources="\\Server\NuGet%3BE:\NuGet"
tf7tbtn2

tf7tbtn23#

下面的 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

下面的示例演示了 Escape() 函数的用法

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

相关问题