你可以用诡计一点点做到这一点:
$([System.String]::Copy('%(Filename)').Replace('config',''))
基本上,我们调用静态方法“复制”来创建一个新的字符串(由于某种原因,它不喜欢它,如果你只是尝试$('%(Filename)'.Replace('.config',''))
),然后调用的字符串替换功能。
全文应该是这样的:
<Target Name="Build">
<Message Text="@(Files->'$([System.String]::Copy("%(Filename)").Replace(".config",""))')" />
</Target>
编辑:的MSBuild 12.0似乎已经打破了上述方法。作为替代,我们可以向所有现有的Files
项目添加新的元数据条目。我们在定义元数据项目时执行替换,然后我们可以像访问其他元数据项目一样访问修改后的值。
例如
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Files Include="Alice.jpg"/>
<Files Include="Bob.not-config.gif"/>
<Files Include="Charlie.config.txt"/>
</ItemGroup>
<Target Name="Build">
<ItemGroup>
<!--
Modify all existing 'Files' items so that they contain an entry where we have done our replace.
Note: This needs to be done WITHIN the '<Target>' (it's a requirment for modifying existing items like this
-->
<Files>
<FilenameWithoutConfig>$([System.String]::Copy('%(Filename)').Replace('.config', ''))</FilenameWithoutConfig>
</Files>
</ItemGroup>
<Message Text="@(Files->'%(FilenameWithoutConfig)')" Importance="high" />
</Target>
</Project>
结果:
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).
你究竟在努力完成什么?希望最终结果是从项目组中的项目中删除扩展名吗?您可能想要将其作为创建来自修改条目的原始项目组的新项目组。如果需要更多的控制,转换或自定义任务可以做到这一点。 – 2011-02-24 16:57:05
嗨。你最终解决了这个问题吗?怎么样?我有一个类似的问题:属性定义不起作用,因为Target将文件列表作为输入,而不是单个文件名。 – superjos 2011-11-08 10:05:26