msbuild:如何提取没有元数据的项?

msbuild:如何提取没有元数据的项?,msbuild,metadata,items,Msbuild,Metadata,Items,我想从msbuild“Item”中提取所有没有元数据的成员(如果我使用了错误的术语,请原谅) 这是我的背景:我正在为创建安装包准备文件。应放入包中的文件在“项”中定义如下: <ItemGroup> <Files Include="readme.txt" /> <Files Include="myfile.txt"> <Rename>help.txt</Rename> </Files> <File

我想从msbuild“Item”中提取所有没有元数据的成员(如果我使用了错误的术语,请原谅)

这是我的背景:我正在为创建安装包准备文件。应放入包中的文件在“项”中定义如下:

<ItemGroup>
  <Files Include="readme.txt" />
  <Files Include="myfile.txt">
    <Rename>help.txt</Rename>
  </Files>
  <Files Include="changes.log" />
  <!-- more files -->
</ItemGroup>
<FilesToCopy Include="@(FilesToRename->'%(Rename)')" />
<FilesToCopy Include="@(Files->Not HasMetadata('Rename'))" />

help.txt
虽然readme.txt应该按原样包含,但myfile.txt应该重命名为help.txt,因为有人认为myfile.txt是一个糟糕的名称。 我创建了一个序列(在目标内部),用于重命名具有“重命名”元数据的文件

<ItemGroup>
  <FilesToRename Include="@(ChangeLogs->HasMetadata('Rename'))"/>
</ItemGroup>
<Move SourceFiles="@(FilesToRename->'$(WorkDir)\source\%(Identity)')" DestinationFiles="@(FilesToRename->'$(WorkDir)\source\%(Rename)')" />

为了将这些文件复制到安装包中,我需要一个项目,其中包括重命名文件的“重命名”名称和其他文件的原始名称;在本例中,“readme.txt;help.txt;changes.log”(按任意顺序)。我的第一次尝试是从上面使用“FilesToRename”,并添加“inversed”表达式,如下所示:

<ItemGroup>
  <Files Include="readme.txt" />
  <Files Include="myfile.txt">
    <Rename>help.txt</Rename>
  </Files>
  <Files Include="changes.log" />
  <!-- more files -->
</ItemGroup>
<FilesToCopy Include="@(FilesToRename->'%(Rename)')" />
<FilesToCopy Include="@(Files->Not HasMetadata('Rename'))" />

但这并没有扩大。我也不能让“条件”起作用,比如

<FilesToCopy Include="@(Files)" Condition="Not @(Files->HasMetadata('Rename'))/>

我以前可能想到过这个解决方案

<FilesToCopy Include="@(FilesToRename->'%(Rename)')" />
<FilesToCopy Include="@Files" Exclude="@(Files->HasMetadata('Rename'))" />

这么简单