9

我正在尝试比较 msbuild 中的两个日期时间戳。我做了以下事情:

<CreateItem Include="@(Compile)->'@(Compile).cache'" 
            Condition="('%(Compile.ExcludeFromStyleCop)' != 'true') and ('%(Compile.ExcludeFromSourceAnalysis)' != 'true') and (@(Compile.ModifiedTime) > @(Compile.cache.ModifiedTime))">
    <Output TaskParameter="Include" ItemName="StyleCopFiles"/>
</CreateItem>

但是,它会抛出以下内容:

错误 MSB4086:尝试对“@(Compile.ModifiedTime)”进行数值比较,结果为“@(Compile.ModifiedTime)”而不是数字,条件为“('%(Compile.ExcludeFromStyleCop)'!='true' ) 和 ('%(Compile.ExcludeFromSourceAnalysis)' != 'true') 和 (@(Compile.ModifiedTime) > @(Compile.cache.ModifiedTime))"。[c:\dev\apt\DotNetMvc\src\Apt.Lib.Data.Elmah\Apt.Lib.Data.Elmah.csproj]

如何比较 msbuild 中的两个日期时间戳?

4

3 回答 3

10

这里一个更简单的解决方案是使用属性函数将 DateTime 对象转换为整数以访问 Ticks 属性。

对于命名文件:

$([System.IO.File]::GetLastWriteTime('SomeFile.bin').Ticks)

或来自项目元数据:

$([System.DateTime]::Parse('%(ItemGroup.ModifiedTime)').Ticks)

然后,您可以使用如下条件表达式比较项目:

Condition="($([System.DateTime]::Parse('%(ItemGroup.ModifiedTime)').Ticks) > $([System.IO.File]::GetLastWriteTime('SomeFile').Ticks)))"

对于这里的问题,我相信这应该有效:

Condition="($([System.DateTime]::Parse('%(Compile.ModifiedTime)').Ticks) > ($([System.DateTime]::Parse('%(Compile.cache.ModifiedTime)').Ticks)"
于 2016-08-29T05:51:35.167 回答
5

尝试使用内联任务:(msbuild v4+ 是必需的,我猜)(我没有测试过)

<UsingTask
    TaskName="CompareDates"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
    <ParameterGroup>
      <FirstDate ParameterType="System.DateTime" Required="true" />
      <SecondDate ParameterType="System.DateTime" Required="true" />
      <Result ParameterType=" "System.Int32" Output="true" />
    </ParameterGroup>
    <Task>
      <Using Namespace="System"/>
      <Code Type="Fragment" Language="cs">
        <![CDATA[
        Log.LogMessage("First Date: " + FirstDate, MessageImportance.High);
        Log.LogMessage("Second Date: " + SecondDate, MessageImportance.High);
        Result = DateTime.Compare(FirstDate, SecondDate);
        ]]>
      </Code>
    </Task>
  </UsingTask>

MsBuild 脚本中的用法:

<CompareDates FirstDate="$(FirstDate)" SecondDate="$(SecondDate)">
      <Output TaskParameter="Result" PropertyName="DateCompareResult"/>
</CompareDates>

<Copy Condition="$(DateCompareResult)=='0'" .../>
于 2013-09-12T09:58:31.053 回答
1

这是我们所做的:

<UsingTask
      TaskName="CompareDates"
      TaskFactory="CodeTaskFactory"
      AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >

      <ParameterGroup>
        <FileList ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
        <CacheFile ParameterType="System.String" Required="true" />
        <Result ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true" />
      </ParameterGroup>
      <Task>
        <Using Namespace="System"/>
        <Code Type="Fragment" Language="cs">
          <![CDATA[
          var modifiedFiles = new List<ITaskItem>();
          //If the cache file exists, only return files that have been edited more recently than it
          if(File.Exists(CacheFile))
          {
            DateTime cacheTimeStamp = File.GetLastWriteTime(CacheFile);
            foreach(var file in FileList)
            {
                if(DateTime.Compare(DateTime.Parse(file.GetMetadata("ModifiedTime")), cacheTimeStamp) > 0)
                {
                    modifiedFiles.Add(file);
                }
            }
                    Result = modifiedFiles.ToArray();
          }
          //Otherwise, return all files
          else
          {
                Result = FileList;
          }
          ]]>
        </Code>
      </Task>
  </UsingTask>

我们使用它如下:

<CompareDates FileList="@(Compile)" CacheFile="My.StyleCop.Cache">
    <Output TaskParameter="Result" ItemName="ChangedFiles"/>
</CompareDates>

并更新了缓存(在 stylecop 任务执行后):

<Touch
    Files="My.StyleCop.cache"
    AlwaysCreate="true"
    Condition="'$(StyleCopViolationCount)' == '0'"/>
<CreateItem Include="Apt.StyleCop.cache">`enter code here`
    <Output TaskParameter="Include" ItemName="FileWrites"/>
</CreateItem>
于 2013-09-12T17:42:58.010 回答