Msbuild 如何从属性中提取目录?

Msbuild 如何从属性中提取目录?,msbuild,Msbuild,我有一个存储完整路径名的属性GroupProj。如何提取属性的目录 我有以下代码,但它没有按预期工作: <PropertyGroup> <GroupProj>C:\development\project\default.groupproj</GroupProj> </PropertyGroup> <Target Name="Default"> <Message Text="Echo: $(GroupProj-&

我有一个存储完整路径名的属性
GroupProj
。如何提取属性的目录

我有以下代码,但它没有按预期工作:

<PropertyGroup>
    <GroupProj>C:\development\project\default.groupproj</GroupProj> 
</PropertyGroup>

<Target Name="Default">
    <Message Text="Echo: $(GroupProj->'%(RootDir)')" />
</Target>
还有其他3个
MSBuild
文件(
project1.dproj
project2.dproj
project3.dproj
)存储在与
default.groupproj
相同的文件夹中

我创建了一个
MSBuild
项目文件(c:\test.targets):

执行将失败,因为
MSBuild
找不到
projectN.dproj
文件。问题在于工作目录未设置为默认值。groupproj

我想到的一个直接解决方案是将$(GroupProj)目录和concat提取到那里
projectN.dproj
文件


这就是我问题的全部内容。

试试这样的方法:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <GroupProj>C:\development\project\default.groupproj</GroupProj> 
    </PropertyGroup>

    <Target Name="Build">
        <CreateItem Include="$(GroupProj)">
          <Output TaskParameter="Include" ItemName="ItemFromProp"/>
      </CreateItem>

      <Message Text="1. @(ItemFromProp -> '%(RootDir)%(Directory)')"/>
      <Message Text="2. %(ItemFromProp.RootDir)%(ItemFromProp.Directory)"/>
      <Message Text="3. %(ItemFromProp.Identity)"/>
      <Message Text="4. %(ItemFromProp.FullPath)"/>
      <Message Text="5. %(ItemFromProp.FileName)"/>
      <Message Text="6. %(ItemFromProp.Extension)"/>
    </Target>
</Project>

C:\development\project\default.groupproj
编辑:

要并行构建项目,请尝试以下操作:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name="GetGroupProjPath">
    <ItemGroup>
      <GroupProj Include="$(GroupProj)" />
      <GroupProjPath Include="@(GroupProj->'%(Directory)')" />
    </ItemGroup>

    <PropertyGroup>
      <GroupProjPath>@(GroupProjPath->'%(RootDir)%(Identity)')</GroupProjPath>
    </PropertyGroup>
  </Target>

  <Import Project="$(GroupProj)" />
  <Target Name="GetDProjs" DependsOnTargets="GetGroupProjPath">
    <ItemGroup>
      <DProjs Include="@(Projects->'$(GroupProjPath)%(FileName)%(Extension)')" />
    </ItemGroup>
  </Target>

  <Target Name="Build" DependsOnTargets="GetDProjs">
    <Message Text="@(DProjs)" />
  </Target>
</Project>

@(GroupProjPath->'%(RootDir)%(Identity)')

试试
。亲密的选民,这不是重复!OP想在MSBuild中打印一个
%(RootDir)
。@TLama谢谢您的更正。我想Delphi标签让我很困惑。“我现在把它取下来了。”周,你到底要做什么?您可以仅为项(
的节点)获取这些众所周知的元数据,但我不清楚您将输出什么。您能详细说明一下吗?@TLama:我只想提取GroupProj的目录名,并将其保存在一个属性中以备不时之需。
apacheant
中类似于
Dirname
的任务已经足够好了。@TLama:我编辑这个问题来描述我真正想要的东西。Thanks@ChauCheeYang我知道上面的例子回答了你的问题,但它不能解决你的问题。如果您不想解决问题,则应直接使用MsBuild“MsBuild”C:\development\project\default.groupproj”调用default.groupproj,因为.groupproj是MsBuild项目,或者您应该从这里尝试答案我正在使用多核CPU。来自
Delphi
的default.groupproj不会并行构建所有
dproj
s。任何时候只执行了1个任务。我正在考虑从原始的
default派生一个新的
msbuild
groupproj。groupproj
利用
BuildInParallel
@chaucheyang查看我的编辑。这将有助于您并行构建项目。您确定使用
BuildInParallel=“False”
将并行构建项目吗?@chaucheyang您是对的,现在已修复。。。现在的问题是。。。这能解决你的问题吗?
c:\> msbuild /p:GroupProj="C:\development\project\default.groupproj" test.targets
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <GroupProj>C:\development\project\default.groupproj</GroupProj> 
    </PropertyGroup>

    <Target Name="Build">
        <CreateItem Include="$(GroupProj)">
          <Output TaskParameter="Include" ItemName="ItemFromProp"/>
      </CreateItem>

      <Message Text="1. @(ItemFromProp -> '%(RootDir)%(Directory)')"/>
      <Message Text="2. %(ItemFromProp.RootDir)%(ItemFromProp.Directory)"/>
      <Message Text="3. %(ItemFromProp.Identity)"/>
      <Message Text="4. %(ItemFromProp.FullPath)"/>
      <Message Text="5. %(ItemFromProp.FileName)"/>
      <Message Text="6. %(ItemFromProp.Extension)"/>
    </Target>
</Project>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name="GetGroupProjPath">
    <ItemGroup>
      <GroupProj Include="$(GroupProj)" />
      <GroupProjPath Include="@(GroupProj->'%(Directory)')" />
    </ItemGroup>

    <PropertyGroup>
      <GroupProjPath>@(GroupProjPath->'%(RootDir)%(Identity)')</GroupProjPath>
    </PropertyGroup>
  </Target>

  <Import Project="$(GroupProj)" />
  <Target Name="GetDProjs" DependsOnTargets="GetGroupProjPath">
    <ItemGroup>
      <DProjs Include="@(Projects->'$(GroupProjPath)%(FileName)%(Extension)')" />
    </ItemGroup>
  </Target>

  <Target Name="Build" DependsOnTargets="GetDProjs">
    <Message Text="@(DProjs)" />
  </Target>
</Project>