问题描述
我有一个Powershell脚本,该脚本依次调用msbuild.exe并使用解决方案值和parameters参数运行它。如果我通过手动编写该行来运行此脚本,则它将按预期运行并构建解决方案,但是,由于该脚本旨在构建多个解决方案,因此参数,解决方案文件路径和msbuild路径都作为变量传递
我需要运行的行如下所示:
& 'C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe' FooBar.sln "/t:rebuild" /p:PlatformTarget=Anycpu /p:Configuration=Release /p:DeployOnBuild=true /p:CustomizablePublishDir=true /p:OutDir=F:\agent\_work\1\s\Deploy.Temp\Foo.Bar.Binaries\\ | Out-Host
将其拆分为变量的方式如下:
$1 = 'C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe'
$2 = 'FooBar.sln'
$3 = "/t:rebuild /p:PlatformTarget=Anycpu /p:Configuration=Release /p:DeployOnBuild=true /p:CustomizablePublishDir=true /p:OutDir=F:\agent\_work\1\s\Deploy.Temp\Foo.Bar.Binaries\\ | Out-Host"
& $1 $2 $3
对于上下文,要获取这些值,我们使用XML,其中包含许多节点,每个节点具有3个属性。
运行参数化脚本时出现的错误如下:
Unhandled Exception: System.ArgumentException: The name "Foo_Bar:PlatformTarget=Anycpu /p:Configuration=Release /p:DeployOnBuild=true /p:CustomizablePublishDir=true /p:OutDir=F:\agent\_work\1\s\Deploy.Temp\Foo.bar.Binaries\\ | Out-Host" contains
an invalid character ".".
显然,这是由于powershell如何处理字符串,但我不知道如何使其工作。
解决方法
| Out-Host
应该不作为参数传递给应用程序-但这不是问题。
这似乎是将所有命令行开关组合在一个字符串中,并在所述参数中的任意位置包含.
的组合-如果我将字符串拆分成单独的部分或将您的OutDir
参数替换为一个不包含任何.
,msbuild
的路径来尝试构建项目:
$msbuild = 'C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\MSBuild.exe'
$solution = 'FooBar.sln'
$arguments = "/t:rebuild /p:PlatformTarget=AnyCPU /p:Configuration=Release /p:DeployOnBuild=true /p:CustomizablePublishDir=true /p:OutDir=F:\agent\_work\1\s\Deploy.Temp\Foo.Bar.Binaries"
&$msbuild $solution $arguments.Split(' ') |Out-Host