MSBuild正则表达式值为空

时间:2016-01-10 10:27:19

标签: c# .net regex msbuild

我无法让我的正则表达式在MSBuild中工作(我实际需要它)。

在C#中正常工作:

        var input = @"Es wird versucht, das Paket aus ""Amusoft.EventManagement.csproj"" zu erstellen.;Paketerstellung der Dateien aus ""D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release"".;""Amusoft.EventManagement.nuspec"" wird für Metadaten verwendet.;Das Paket ""D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg"" wurde erfolgreich erstellt.;Es wird versucht, das Symbolpaket für ""Amusoft.EventManagement.csproj"" zu erstellen.;Paketerstellung der Dateien aus ""D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release"".;""Amusoft.EventManagement.nuspec"" wird für Metadaten verwendet.;Das Paket ""D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbols.nupkg"" wurde erfolgreich erstellt.";
        var m = Regex.Match(input, "(?<=\")[^\"]+nupkg(?=\")");

返回D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg

这正是我想要的。但是我无法在MSBuild中返回任何内容,这就是我需要的地方。

MSBuild尝试让它工作:

<Target Name="AfterBuild" Condition="'$(Configuration)' == 'Release'">
    <!-- Ensure Directory + Package project-->
    <MakeDir Directories="$(SolutionDir)build\$(ProjectName)\$(Configuration)\"/>
    <Exec ConsoleToMSBuild="true"  Command="nuget pack $(ProjectPath) -Symbols -Prop Configuration=Release -OutputDirectory $(SolutionDir)build\$(ProjectName)\$(Configuration)" >
        <Output TaskParameter="ConsoleOutput" ItemName="NugetPackOutput"/>
    </Exec>

    <!-- Prepare pushing process -->
    <Message Importance="High" Condition="!Exists('$(ProjectDir)nugetapikey.txt')" Text="nugetapikey.txt does not exist." />
    <ReadLinesFromFile Condition="Exists('$(ProjectDir)nugetapikey.txt')" File="$(ProjectDir)nugetapikey.txt">
        <Output TaskParameter="Lines" ItemName="NugetApiKey"/>
    </ReadLinesFromFile>
    <Message Importance="High" Condition="Exists('$(ProjectDir)nugetapikey.txt')" Text="NugetApiKey is '@(NugetApiKey)'" />
    <PropertyGroup>
        <NugetPackageFileName2>$([System.Text.RegularExpressions.Regex]::Match(@(NugetPackOutput), `(?&lt;=&quot;)[^&quot;]+nupkg(?=&quot;)`))</NugetPackageFileName2>
        <NugetPackageFileName>$([System.Text.RegularExpressions.Regex]::Match(@(NugetPackOutput), `(?&lt;=")[^"]+.nupkg(?=")`))</NugetPackageFileName>
        <NugetPushCommand>nuget push PICKNAMEINEXPLORER $(NugetPackageFileName) -ApiKey @(NugetApiKey) -Timeout 60 -Verbosity normal</NugetPushCommand>
    </PropertyGroup>
    <Message Importance="High" Text="Pushcommand is $(NugetPushCommand)" />
    <Message Importance="High" Text="Pack Output is @(NugetPackOutput)" />
    <Message Importance="High" Text="NugetPackageFileName is $(NugetPackageFileName)" />
    <Message Importance="High" Text="NugetPackageFileName2 is $(NugetPackageFileName2)" />
    <Message Importance="High" Text="Regex1 is $([System.Text.RegularExpressions.Regex]::Match(@(NugetPackOutput), '.+'))" />
    <Message Importance="High" Text="Regex2 is $([System.Text.RegularExpressions.Regex]::Match(@(NugetPackOutput), `.+`))" />
    <Message Importance="High" Text="Regex3 is $([System.Text.RegularExpressions.Regex]::Match(@(NugetPackOutput), '(?&lt;=&quot;)[^&quot;]+nupkg(?=&quot;)'))" />
    <WriteLinesToFile Condition="Exists('$(ProjectDir)nugetapikey.txt')" File="$(SolutionDir)build\$(ProjectName)\$(Configuration)\pushcommand.txt" Lines="$(NugetPushCommand)" Overwrite="true"  Encoding="Unicode"/>
    <Exec ConsoleToMSBuild="true" ContinueOnError="true" IgnoreExitCode="true" Command="explorer.exe $(SolutionDir)build\$(ProjectName)\$(Configuration)" />
  </Target>

结果:

NugetPackageFileName is 1> NugetPackageFileName2 is 1> Regex1 is Es wird versucht, das Paket aus "Amusoft.EventManagement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird für Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde erfolgreich erstellt.;Es wird versucht, das Symbolpaket für "Amusoft.EventManagement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird für Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbols.nupkg" wurde erfolgreich erstellt. 1> Regex2 is Es wird versucht, das Paket aus "Amusoft.EventManagement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird für Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde erfolgreich erstellt.;Es wird versucht, das Symbolpaket für "Amusoft.EventManagement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird für Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbols.nupkg" wurde erfolgreich erstellt. 1> Regex3 is 1> Regex3 is

.+和&#39;。+&#39;试图验证内联Regex是否正常工作 - 情况就是这样。但是,任何通过正则表达式获取值的实际尝试都会失败。

基本上我在这里尝试做的是拥有一个构建脚本(当我完成时)将打开一个控制台窗口,其中包含一个预先填充的命令,可以将软件包推送到nuget,而不会在源代码管理中删除我的apikey /的csproj。除了获得我的正则表达式值之外,其余版本已在以前的版本中使用过。

问题:

有没有人知道我在Regex的MSBuild版本中做错了什么?

1 个答案:

答案 0 :(得分:1)

这里的问题不在于正则表达式。 Match需要一个String,它适用于Properties,但不适用于Items

您需要更改Exec的输出类型(参见下文),然后参考$(NugetPackOutput)而不是@(NugetPackOutput)

<强>之前

<Output TaskParameter="ConsoleOutput" ItemName="NugetPackOutput"/>

<强>后

<Output TaskParameter="ConsoleOutput" PropertyName="NugetPackOutput"/>

这是一个证明这一点的测试。请注意,在MatchItem2的情况下,正则表达式实际上与ItemName而不是输出匹配。

<强> test.bat的

@ECHO off
ECHO Es wird versucht, das Paket aus "Amusoft.EventManagement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird für Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde erfolgreich erstellt.;Es wird versucht, das Symbolpaket für "Amusoft.EventManagement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird für Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbols.nupkg" wurde erfolgreich erstellt.

<强> BuildApp.csproj

<Target Name="Test">
  <Exec ConsoleToMSBuild="true" Command="test.bat">
    <Output TaskParameter="ConsoleOutput" ItemName="OutputItem" />
    <Output TaskParameter="ConsoleOutput" PropertyName="OutputProperty" />
  </Exec>
  <Message Text="OutputItem: @(OutputItem)" />
  <Message Text="---" />
  <Message Text="OutputProperty: $(OutputProperty)" />
  <Message Text="---" />
  <Message Text="MatchItem1: $([System.Text.RegularExpressions.Regex]::Match(@(OutputItem), '.+'))" />
  <Message Text="---" />
  <Message Text="MatchItem2: $([System.Text.RegularExpressions.Regex]::Match(@(OutputItem), '.{5}'))" />
  <Message Text="---" />
  <Message Text="MatchItem3: $([System.Text.RegularExpressions.Regex]::Match(@(OutputItem), '(?&lt;=&quot;)[^&quot;]+nupkg(?=&quot;)'))" />
  <Message Text="---" />
  <Message Text="MatchProperty: $([System.Text.RegularExpressions.Regex]::Match($(OutputProperty), '(?&lt;=&quot;)[^&quot;]+nupkg(?=&quot;)'))" />
</Target>

测试输出

Test:
  test.bat
  Es wird versucht, das Paket aus "Amusoft.EventManagement.csproj" zu erstellen
  .;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventManagement\Amu
  soft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspec" wird f?r
  Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManagement\build\
  Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde erfolgreich erst
  ellt.;Es wird versucht, das Symbolpaket f?r "Amusoft.EventManagement.csproj"
  zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventMa
  nagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspe
  c" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManag
  ement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbols.nupkg" wu
  rde erfolgreich erstellt.
  OutputItem: Es wird versucht, das Paket aus "Amusoft.EventManagement.csproj"
  zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventMa
  nagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspe
  c" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManag
  ement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde erfo
  lgreich erstellt.;Es wird versucht, das Symbolpaket f?r "Amusoft.EventManagem
  ent.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amu
  soft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventMana
  gement.nuspec" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusof
  t.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbo
  ls.nupkg" wurde erfolgreich erstellt.
  ---
  OutputProperty: Es wird versucht, das Paket aus "Amusoft.EventManagement.cspr
  oj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.Eve
  ntManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.n
  uspec" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventM
  anagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde
  erfolgreich erstellt.;Es wird versucht, das Symbolpaket f?r "Amusoft.EventMan
  agement.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft
  \Amusoft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.Event
  Management.nuspec" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Am
  usoft.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.s
  ymbols.nupkg" wurde erfolgreich erstellt.
  ---
  MatchItem1: Es wird versucht, das Paket aus "Amusoft.EventManagement.csproj"
  zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amusoft.EventMa
  nagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventManagement.nuspe
  c" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusoft.EventManag
  ement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.nupkg" wurde erfo
  lgreich erstellt.;Es wird versucht, das Symbolpaket f?r "Amusoft.EventManagem
  ent.csproj" zu erstellen.;Paketerstellung der Dateien aus "D:\SVN\Amusoft\Amu
  soft.EventManagement\Amusoft.EventManagement\bin\Release".;"Amusoft.EventMana
  gement.nuspec" wird f?r Metadaten verwendet.;Das Paket "D:\SVN\Amusoft\Amusof
  t.EventManagement\build\Amusoft.EventManagement\Release\WeakEvent.2.0.0.symbo
  ls.nupkg" wurde erfolgreich erstellt.
  ---
  MatchItem2: @(Out
  ---
  MatchItem3:
  ---
  MatchProperty: D:\SVN\Amusoft\Amusoft.EventManagement\build\Amusoft.EventMana
  gement\Release\WeakEvent.2.0.0.nupkg