从Powershell脚本更改MSBuild属性

时间:2019-07-08 18:01:16

标签: powershell msbuild

我正在通过nuget包将以下目标xml添加到我的csproj中

<Project>
  <Target Name="AfterBuild">
    <PropertyGroup>
      <DockerExe Condition=" '$(DockerExe)'=='' ">"C:\Program Files\Docker\Docker\resources\bin\docker.exe"</DockerExe>
      <ImageName Condition=" '$(ImageName)'=='' ">$(MSBuildProjectName)</ImageName>
      <PowershellExe Condition=" '$(PowerShellExe)'=='' ">C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</PowershellExe>
    </PropertyGroup>
    <Exec Command="$(PowershellExe) -NonInteractive -executionpolicy Unrestricted -command $(MSBuildThisFileDirectory)..\tools\image_name.ps1" />
    <Exec Command="$(DockerExe) build -t $(ImageName) ." />
  </Target>  
</Project>

image_name.ps1包含

$name = $(ImageName)
$name = $name.ToLower()
$name = $name.Replace(".", "_")

echo "Name is:"
echo $name

# $(ImageName) = $name

实际上正在调用Powershell脚本,但是$name(和$(ImageName))是null,我不知道如何访问和更新目标文件中设置的ImageName属性。我尝试了$name = $Env:ImageName,但是分配的结果也是null

2 个答案:

答案 0 :(得分:1)

powershell脚本中的这些变量为nul的原因是因为powershell对msbuild完全一无所知。而且,msbuild并没有告知Powershell这些值应该是什么。

无论如何,所有这些字符串修改都是不必要的,因为msbuild可以使用属性函数为您完成此操作: https://docs.microsoft.com/en-us/visualstudio/msbuild/property-functions?view=vs-2019

因此,您甚至不需要调用Powershell脚本来为您修改字符串。

最后: Jakobii在上面的答案是使Powershell脚本正常工作的地方。但是最后,您将无法将修改后的字符串从Powershell脚本中重新带回msbuild。

答案 1 :(得分:0)

我不确定自己要做什么。但这可能是您想要的吗? .ps1文件可以具有类似于二进制文件的参数。

C:\path\to\image_name.ps1 -ImageName 'Some Image Name'

image_name.ps1

param(
    $ImageName
)
$name = $ImageName
$name = $name.ToLower()
$name = $name.Replace(".", "_")

write-host "Name is: $name"