在MSBuild中,是否可以对元数据项使用String.Replace函数?

在MSBuild中,是否可以对元数据项使用String.Replace函数?,msbuild,Msbuild,在MSBuild v4中,可以对属性使用函数(如string.replace)。但是如何在元数据上使用函数呢 我想使用字符串。替换函数如下: <Target Name="Build"> <Message Text="@(Files->'%(Filename).Replace(&quot;.config&quot;,&quot;&quot;)')" /> </Target> 不幸的是,这输出为(不

在MSBuild v4中,可以对属性使用函数(如
string.replace
)。但是如何在元数据上使用函数呢

我想使用
字符串。替换
函数如下:

<Target Name="Build">
        <Message Text="@(Files->'%(Filename).Replace(&quot;.config&quot;,&quot;&quot;)')" />
</Target>   

不幸的是,这输出为(不完全是我想要的): log4net.Replace(“.config”,”);ajaxPro.Replace(“.config”,”);appSettings.Replace(“.config”,”);cachingConfiguration20.Replace(“.config”,”);cmsSiteConfiguration.Replace(“.config”,”);dataProductsGraphConfiguration.Replace(“.config”和“”);ajaxPro.Replace(“.config”,”);appSettings.Replace(“.config”,”);cachingConfiguration20.Replace(“.config”,”);cmsSiteConfiguratio


有什么想法吗?

这些函数只在属性中工作(如我所知)。因此,创建将执行操作抛出批处理的目标:

<Target Name="Build"                                 
      DependsOnTargets="ProcessFile" />

<Target Name="ProcessFile"
       Outputs="%(Files.Identity)">
   <PropertyGroup>
       <OriginalFileName>%(Files.Filename)</OriginalFileName>
       <ModifiedFileName>$(OriginalFileName.Replace(".config",""))</ModifiedFileName>
   </PropertyGroup>
   <Message Text="$(ModifiedFileName)" Importance="High"/>
</Target>

%(Files.Filename)
$(OriginalFileName.Replace(“.config”,”)
在你的例子中,你真的需要这样的任务吗?我的意思是存在


编辑:我应该指定此任务处理@(文件)中的所有项目。

我认为您不能直接将函数用于项目组和元数据(这很容易) 但是,您可以使用批处理:

<Target Name="Build"                                 
      DependsOnTargets="ProcessFile" />

<Target Name="ProcessFile"
       Outputs="%(Files.Identity)">
   <PropertyGroup>
       <OriginalFileName>%(Files.Filename)</OriginalFileName>
       <ModifiedFileName>$(OriginalFileName.Replace(".config",""))</ModifiedFileName>
   </PropertyGroup>
   <Message Text="$(ModifiedFileName)" Importance="High"/>
</Target>
以下是本文的观点:

我试图修剪一个要发送到命令行工具的项目组(我需要丢失文件名中的.server)


$(CurrentXmlFile.Replace('.server','')

你可以通过一点小技巧来做到这一点:

$([System.String]::Copy('%(Filename)').Replace('config',''))
基本上,我们调用静态方法“Copy”来创建一个新字符串(出于某种原因,如果您只是尝试
$('%(Filename)'.Replace('.config',''))
,它不喜欢它),然后调用字符串上的Replace函数

全文如下:

<Target Name="Build">
        <Message Text="@(Files->'$([System.String]::Copy(&quot;%(Filename)&quot;).Replace(&quot;.config&quot;,&quot;&quot;))')" />
</Target>
结果:

D:\temp>"c:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe" /nologo test.xml
Build started 2015/02/11 11:19:10 AM.
Project "D:\temp\test.xml" on node 1 (default targets).
Build:
  Alice;Bob.not-config;Charlie
Done Building Project "D:\temp\test.xml" (default targets).
遇到了同样的问题(MakeRelative除外),所以我通过了另一个解决方案:使用好的旧CreateItem,它接受字符串并转换为Item:)


对于MSBuild 12.0,这里有一个替代方案

<Target Name="Build">
    <Message Text="$([System.String]::Copy(&quot;%(Files.Filename)&quot;).Replace(&quot;.config&quot;,&quot;&quot;))" />
</Target>

我需要做一些类似的事情,以下几点对我很有用

<Target Name="Build">
  <Message Text="@(Files->'%(Filename)'->Replace('.config', ''))" />
</Target>


我不知道您可以基于另一个属性创建属性。非常非常有用!恐怕不是:(Files.FileName是一个集合,但$ModifiedFileName最终只是一个值。我需要在“文件”中的每个项上运行“替换”。1)它处理@(文件)中的每个项。2)您的意思是在元数据中存储多个值吗?请给出您使用的项的示例。这是MSBuild 4.0唯一的技巧吗?或者它与MSBuild 3.5(2.0)一起工作?替换成为感兴趣的操作命令。你实际上想要完成什么?从项目组中的项目中删除扩展名是否是理想的最终结果?您可能希望通过修改条目,从原始项目组创建新的项目组。如果需要更多控制,则转换或自定义任务可以执行此操作。Hi。你最终解决了这个问题吗?怎么用?我有一个类似的问题:属性定义不起作用,因为目标有一个文件列表作为输入,而不是一个文件名。使用msbuild 12.0(和.net 4.0),结果是“%(文件名);%(文件名);…”。我的环境出了什么问题?@nilleb你能把相关的代码发布到某个地方(例如pastebin.com)吗?我会看看我是否能找出问题所在。我已经发布了MSBuild 12.0的另一个答案。我建议使用
$([MSBuild]::ValueOrDefault('%(MetadataName)',)。替换('foo','bar')
而不是String.Copy,为了避免实际创建字符串数据的副本。有关信息:MSBuild的GitHub存储库中存在一个相关的未解决问题:。这似乎是最简洁的答案。对我来说,这似乎是最好的答案。它使用了MSBuild项函数,我认为它是最干净、最惯用的。它也不会像其他方法那样导致字符串复制。更多信息请访问
<Target Name="Build">
    <Message Text="$([System.String]::Copy(&quot;%(Files.Filename)&quot;).Replace(&quot;.config&quot;,&quot;&quot;))" />
</Target>
<Target Name="Build">
  <Message Text="@(Files->'%(Filename)'->Replace('.config', ''))" />
</Target>