2

我有以下

<RegexMatch Input="$(Configuration)" Expression="^.*?(?=\.)">
   <Output ItemName="Theme" TaskParameter="Output" />
</RegexMatch>

我的配置变量如下 Theme.Environment

所以“Default.Debug”或“Yellow.Release”

我想将第一部分放入一个名为主题的变量中。我已经测试了这个正则表达式,它可以在独立的正则表达式测试器中工作

^.*?(?=\.)

但在我的构建文件中使用时不是。

我正在回显变量,以便我可以看到输出

<Exec Command="echo $(Theme)"/>
<Exec Command="echo $(Configuration)"/>

想法?

4

2 回答 2

2

如果您应该为此使用 MSBuild 社区任务 - 请检查此行:<Output PropertyName="Theme" TaskParameter="Output" />

PropertyName="Theme"如果您想$(Theme)稍后 引用它,您应该使用它。ItemName将创建项目集,而不是属性。

但是,使用 MSBuild 4.0 内联函数比使用 Msbuild 社区任务执行该具体任务要简单得多。您的代码将如下所示(采用您的脚本):

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTarget="Play">
  <PropertyGroup>
    <Configuration>Yellow.Release</Configuration>
  </PropertyGroup>


  <Target Name="Play">

    <PropertyGroup>
      <Theme>$([System.Text.RegularExpressions.Regex]::Match($(Configuration), `^.*?(?=\.)`))</Theme>
    </PropertyGroup>

    <Message Text="$(Theme)" />
    <Message Text="$(Configuration)" />
  </Target>
</Project>
于 2012-10-21T17:39:04.803 回答
0

刚刚意识到 RegexMatch 不会返回匹配的字符串,而是如果匹配则返回整个字符串。

基本上它称为 IsMatch 方法而不是 Match 方法

已重新编写为 RegexReplace

<RegexReplace Input="$(Configuration)" Expression="\..*" Replacement="" Count="1">
    <Output ItemName="Theme" TaskParameter="Output" />
</RegexReplace>

在那之后它仍然没有工作,然后我意识到我在做

$(Theme)

本来应该

@(Theme)
于 2012-10-22T13:53:44.223 回答