2010-05-18 56 views
0

比方說,我有子路徑列表如如何從屬性值創建複製項目?

<PropertyGroup> 
    <subPaths>$(path1)\**\*; $(path2)\**\*; $(path3)\file3.txt; </subPaths> 
</PropertyGroup> 

我想從文件夾中的這些文件複製到文件夾B(想必大家已經在一個所有子文件夾/文件)。我嘗試的是:

<Target Name="Replace" DependsOnTargets="Replace_Init; Replace_Copy1Path"> 
</Target> 

<Target Name="Replace_Init"> 
    <PropertyGroup> 
    <subPaths>$(path1)\**\*; $(path2)\**\*; $(path3)\file3.txt; </subPaths> 
    </PropertyGroup> 
    <ItemGroup> 
    <subPathItems Include="$(subPathFiles.Split(';'))" /> 
    </ItemGroup> 
</Target> 

<Target Name="Replace_Copy1Path" Outputs="%(subPathItems.Identity)"> 
    <PropertyGroup> 
    <src>$(folderA)\%(subPathItems.Identity)</src> 
    <dest>$(folderB)\%(subPathItems.Identity)</dest> 
    </PropertyGroup> 
    <Copy SourceFiles="$(src)" DestinationFiles="$(dest)" /> 
</Target> 

但複製任務不起作用。它不會將**\*轉換爲文件。我做錯了什麼?請幫忙!

回答

2

我不認爲你可以做那樣的事情。

$(subPathFiles.Split(';'))返回一個屬性,其中值用分號分隔,所以這個調用是無用的。

如果你想保持這種機制,你應該從MSBuild Extension Pack使用任務StringToItemCol

<Target Name="Replace_Init"> 
    <PropertyGroup> 
    <subPaths>$(path1)\**\*; $(path2)\**\*; $(path3)\file3.txt; </subPaths> 
    </PropertyGroup> 

    <MsBuildHelper TaskAction="StringToItemCol" 
       ItemString="$(subPaths)" Separator=";"> 
    <Output TaskParameter="OutputItems" ItemName="subPathItems "/> 
    </MsBuildHelper> 
</Target> 

否則,你可以直接通過項目與folderA和子路徑嵌入:

<ItemGroup> 
    <subPathIt Include="$(folderA)\$(path1)\**\*"/> 
    <subPathIt Include="$(folderA)\$(path2)\**\*"/> 
    <subPathIt Include="$(folderA)\$(path3)\file3.txt" Condition="Exists('$(path3)\file3.txt')"/> 
</ItemGroup> 


<Target Name="Replace_Copy1Path"> 
    <Copy SourceFiles="@(subPathItems)" 
     DestinationFiles="$(folderB)\%(RecursiveDir)\%(Filename)%(Extension)" /> 
</Target> 
+0

你可以使用分號在項目定義內分隔多個項目列表。這是否回答你的問題? – 2010-05-20 11:42:45

+0

謝謝madgnome!但正如你所說,如果我們做,我們不會有@files其中包含所有文件folderA和folderB,對嗎? – 2010-05-19 11:44:15

+0

沒錯。你必須寫兩個單獨的 2010-05-19 11:53:09