Вы можете сделать это с небольшой хитростью:
$([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).