MSBuild-等待x秒

MSBuild-等待x秒,msbuild,Msbuild,我有一个部署web应用程序的MSBuild脚本。 它通过将“app_offline.htm”文件复制到服务器来停止当前web应用。 在此之后,它会删除其他文件,然后将新文件复制到服务器 我需要在复制'app_offline.htm'和删除之间添加延迟 我的当前脚本抛出错误,因为当脚本尝试删除文件时,文件仍然被锁定 在MSBuild中执行此操作的最佳方法是什么 我的停止任务看起来像这样 <Target Name="Stop"> <WriteLinesToFile Fi

我有一个部署web应用程序的MSBuild脚本。 它通过将“app_offline.htm”文件复制到服务器来停止当前web应用。 在此之后,它会删除其他文件,然后将新文件复制到服务器

我需要在复制'app_offline.htm'和删除之间添加延迟

我的当前脚本抛出错误,因为当脚本尝试删除文件时,文件仍然被锁定

在MSBuild中执行此操作的最佳方法是什么

我的停止任务看起来像这样

  <Target Name="Stop">
    <WriteLinesToFile File="$(DeployDirectory)\app_offline.htm" Lines="Offline for maintenance" Overwrite="true" Encoding="Unicode"/>
  </Target>
  <Target Name="Clean">
    <ItemGroup>
      <Files Include="$(DeployDirectory)\**\*" Exclude="$(DeployDirectory)\app_offline.htm" />
      <Files Include="$(LogDirectory)\*" />
    </ItemGroup>
    <Delete Files="@(Files)" />
  </Target>

我的删除任务如下所示

  <Target Name="Stop">
    <WriteLinesToFile File="$(DeployDirectory)\app_offline.htm" Lines="Offline for maintenance" Overwrite="true" Encoding="Unicode"/>
  </Target>
  <Target Name="Clean">
    <ItemGroup>
      <Files Include="$(DeployDirectory)\**\*" Exclude="$(DeployDirectory)\app_offline.htm" />
      <Files Include="$(LogDirectory)\*" />
    </ItemGroup>
    <Delete Files="@(Files)" />
  </Target>

您可以使用Exec任务从中调用一个解决方案,例如,ping是非实用的,因此应该可以工作。差不多

<Exec Command="ping -n 6 127.0.0.1 > nul"/>
<Delete Files="@(Files)" />

另请参见:将来,删除任务可能会获得与复制任务类似的参数。因此,另一种选择是使用设置了重试次数的Copy来尝试覆盖正在使用的其中一个文件,当覆盖成功时,您知道该文件不再使用,可以继续删除:

<Copy SourceFiles="someFile" DestinationFile="$(DeployDirectory)\someFileInUse" 
      RetryDelayMilliseconds="1000" Retries="5"/>
<Delete Files="@(Files)" />


当然,如果超时过期且文件仍在使用中,这两种解决方案都会失败,但如果不冒无限等待的风险,则无法做到这一点。

有多种可用选项:

  • 具有内置的
    睡眠
    任务。您可以这样使用它:

    <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" />
    <Sleep Milliseconds="300" />