比较Msbuild中的DateTime标记

bad*_*ndu 6 c# msbuild

我想在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>
Run Code Online (Sandbox Code Playgroud)

但是,它会引发以下情况:

错误MSB4086:尝试对"@(Compile.ModifiedTime)"进行数值比较,评估为"@(Compile.ModifiedTime)"而不是数字,条件为"('%(Compile.ExcludeFromStyleCop)'!='true' )和('%(Compile.ExcludeFromSourceAnalysis)'!='true')和(@(Compile.ModifiedTime)> @(Compile.cache.ModifiedTime))".[C:\ dev的\易于\ DotNetMvc\SRC\Apt.Lib.Data.Elmah\Apt.Lib.Data.Elmah.csproj]

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

Lud*_*dwo 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>
Run Code Online (Sandbox Code Playgroud)

在MsBuild脚本中的用法:

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

<Copy Condition="$(DateCompareResult)=='0'" .../>
Run Code Online (Sandbox Code Playgroud)


Rog*_*ers 5

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

对于命名文件:

$([System.IO.File]::GetLastWriteTime('SomeFile.bin').Ticks)
Run Code Online (Sandbox Code Playgroud)

或来自项目元数据:

$([System.DateTime]::Parse('%(ItemGroup.ModifiedTime)').Ticks)
Run Code Online (Sandbox Code Playgroud)

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

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

对于这里的问题,我认为这应该可行:

Condition="($([System.DateTime]::Parse('%(Compile.ModifiedTime)').Ticks) > ($([System.DateTime]::Parse('%(Compile.cache.ModifiedTime)').Ticks)"
Run Code Online (Sandbox Code Playgroud)