MSBuild从ItemGroup的批处理中删除Directory字段中的反斜杠

时间:2014-01-28 23:03:45

标签: msbuild

我有一个.csproj文件我正在尝试配置执行几个项目的构建,映射驱动器指向项目的输出以及一些支持文档,构建安装程序,然后取消映射驱动器。当我调用subst来映射驱动器时,由于路径中的尾部反斜杠,我不断得到错误。这是构建和映射目标

  <Target Name="BuildApps">
    <MSBuild Projects="..\MsApp\MsApp.csproj; ..\AvApp\AvApp.csproj"
             Targets="Build">
      <Output TaskParameter="TargetOutputs"
              ItemName="PackageOutput"            
              />
    </MSBuild>
  </Target>

  <Target Name="MapDrives">
    <Exec Condition="'%(PackageOutput.Filename)' == 'MsApp'" Command="subst O: &quot;%(PackageOutput.Rootdir)%(PackageOutput.Directory)&quot;" WorkingDirectory="C:" ContinueOnError="true" />
    <Exec Condition="'%(PackageOutput.Filename)' == 'AvApp'" Command="subst P: &quot;%(PackageOutput.Rootdir)%(PackageOutput.Directory)&quot;" WorkingDirectory="C:" ContinueOnError="true" />
  </Target>

在研究这个问题时,我遇到了this question on removing the backslash。当我将目标修改为

  <Target Name="MapDrives">
    <PropertyGroup Condition="'%(PackageOutput.Filename)' == 'MsApp'">
      <MsDirectory>%(PackageOutput.Directory)</MsDirectory>
    </PropertyGroup>
    <PropertyGroup Condition="'%(PackageOutput.Filename)' == 'AvApp'">
      <AvDirectory>%(PackageOutput.Directory)</AvDirectory>
    </PropertyGroup>
    <Exec Condition="'%(PackageOutput.Filename)' == 'MsApp'" Command="subst O: &quot;%(PackageOutput.Rootdir)$(MsDirectory.TrimEnd('\'))&quot;" WorkingDirectory="C:" ContinueOnError="true" />
    <Exec Condition="'%(PackageOutput.Filename)' == 'AvApp'" Command="subst P: &quot;%(PackageOutput.Rootdir)$(AvDirectory.TrimEnd('\'))&quot;" WorkingDirectory="C:" ContinueOnError="true" />
  </Target>

我收到错误

  

错误MSB4190:在此条件下不允许引用位置1处的内置元数据“文件名”“'%(PackageOutput.Filename)'=='MsApp'”

研究这个错误,我遇到this并且在可能在错误中起作用的项之前评估属性的事实。所以,我的问题是有一种简单的方法可以通过将此项目列表转换为属性或对项目执行字符串操作的方式来删除反斜杠吗?

1 个答案:

答案 0 :(得分:0)

我设法使用以下语法使用它:

<Exec Condition="'%(PackageOutput.Filename)' == 'MsApp'" Command="subst O: &quot;@(PackageOutput->Replace('\MsApp.exe', ''))&quot;" WorkingDirectory="C:" ContinueOnError="true" />
<Exec Condition="'%(PackageOutput.Filename)' == 'AvApp'" Command="subst P: &quot;@(PackageOutput->Replace('\AvApp.exe', ''))&quot;" WorkingDirectory="C:" ContinueOnError="true" />