如何在msbuild配置文件中获取目录名称?

时间:2018-01-31 19:10:45

标签: msbuild

这是我正在使用的简单代码。它获取目录中的所有文件夹,然后给我文件夹名称。

<TestProjectFolderPath Include="$([System.IO.Directory]::GetDirectories(`$(SolutionDir)`,`*.Tests`))" />
<TestProjectFolderNames Include="@(TestProjectFolderPath->'$([System.IO.Path]::GetDirectoryName(`$([System.IO.Path]::GetFileName(`%(Identity)`))`)',' ')" />

但是在TestProjectFolderNames [System.IO.Path]中,函数没有得到评估,只是作为字符串返回,例如:

 $([System.IO.Path]::GetDirectoryName($([System.IO.Path]::GetFileName(C:\Some.Unit.Tests)))

我需要帮助才能理解正确的语法以使其正常工作。

1 个答案:

答案 0 :(得分:1)

在转换项目时使用项目元数据上的属性函数不支持我想(也许它是最新的MSBuild版本,但我现在无法测试)。作为一种解决方法,您可以自己添加新的元数据,因为它就像一个属性,对于最近的MSBuild版本来说,一切正常:

<ItemGroup>
  <TestProjectFolderPath Include="$([System.IO.Directory]::GetDirectories(`$(SolutionDir)`,`*.Tests`))" />
  <TestProjectFolderPath>
    <FolderName>$([System.IO.Path]::GetFileName(`%(Identity)`))</FolderName>
  </TestProjectFolderPath>
</ItemGroup>
<Message Text="@(TestProjectFolderPath->'%(FolderName)', ' ')" />

编辑查看评论,根据Sherry的旧版MSBuild版本,相应的商品代码为:

<TestProjectFolderPath Include="$([System.IO.Directory]::GetDirectories($(SolutionDir),*.Tests))">
  <FolderName>$([System.IO.Path]::GetFileName(%(Identity)))</FolderName>
</TestProjectFolderPath>

我遗漏了GetDirectoryName,因为在GetFileName的结果上调用它是没有意义的。