msbuild“;无法删除目录”;

msbuild“;无法删除目录”;,msbuild,cruisecontrol.net,Msbuild,Cruisecontrol.net,我们的一个CruiseControl.NET项目持续间歇性失败,因为msbuild任务在以下情况下失败: 错误MSB3231:无法删除目录“d:\Somewhere\Dir\Admin”。参数不正确 对应的msbuild脚本行仅为 <RemoveDir Directories="$(DistributionDir)\Admin" Condition="Exists('$(DistributionDir)\Admin')" /> 下一次(成功的)构建尝试只是一次令人厌烦的成功目录删除

我们的一个CruiseControl.NET项目持续间歇性失败,因为msbuild任务在以下情况下失败:

错误MSB3231:无法删除目录“d:\Somewhere\Dir\Admin”。参数不正确

对应的msbuild脚本行仅为

<RemoveDir Directories="$(DistributionDir)\Admin" Condition="Exists('$(DistributionDir)\Admin')" />
下一次(成功的)构建尝试只是一次令人厌烦的成功目录删除:

10:31:21,8616463    MSBuild.exe 1760    CreateFile  D:\Somewhere\Dir\Admin  SUCCESS Desired Access: Read Data/List Directory, Synchronize, Disposition: Open, Options: Directory, Synchronous IO Non-Alert, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
10:31:21,8616861    MSBuild.exe 1760    QueryDirectory  D:\Somewhere\Dir\Admin\*    SUCCESS Filter: *, 1: .
10:31:21,8617305    MSBuild.exe 1760    QueryDirectory  D:\Somewhere\Dir\Admin  SUCCESS 0: ..
10:31:21,8617589    MSBuild.exe 1760    QueryDirectory  D:\Somewhere\Dir\Admin  NO MORE FILES   
10:31:21,8618209    MSBuild.exe 1760    CloseFile   D:\Somewhere\Dir\Admin  SUCCESS 
10:31:21,8621579    MSBuild.exe 1760    CreateFile  D:\Somewhere\Dir\Admin  SUCCESS Desired Access: Read Attributes, Delete, Synchronize, Disposition: Open, Options: Directory, Synchronous IO Non-Alert, Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
10:31:21,8622118    MSBuild.exe 1760    QueryAttributeTagFile   D:\Somewhere\Dir\Admin  SUCCESS Attributes: D, ReparseTag: 0x0
10:31:21,8622408    MSBuild.exe 1760    SetDispositionInformationFile   D:\Somewhere\Dir\Admin  SUCCESS Delete: True
10:31:21,8622676    MSBuild.exe 1760    CloseFile   D:\Somewhere\Dir\Admin  SUCCESS 
似乎出于某种原因,MSBuild/Windows在执行目录删除之前检测到某种无效的参数错误,但我不知道该去哪里查找。(我还尝试运行chkdsk,没有找到任何内容。我还删除并重新创建了父D:\Somewhere\Dir目录,没有任何更改。)

那么,你知道问题可能在哪里,或者我应该如何进一步调查吗


(我不确定这个问题应该到哪里去,它介于程序、服务器故障、超级用户之间……)

我不知道为什么会失败,但是如果文件夹是唯一剩下的东西,构建能否正确完成?如果是这样的话,一个解决方法是指定ContinueOnError=“True”。

这可能有点晚了,但我发现了相同的错误,问题似乎在Exists条件下。对条件的评估似乎无法释放与任务执行冲突的目录。
通过删除条件,如果目录存在,将删除目录,但如果目录不存在,则语句不会失败:


尝试了很多方法,但我不明白为什么当目录不是空的时候,这种方法有时会失败;在我们的例子中,目录包含符号链接(如果这很重要的话)。无论如何,我不喜欢使用
ContinueOnError
,因为这意味着当出现实际错误时,你不知道它,或者必须做额外的检查,比如
,我自己刚刚遇到这个错误,事实证明,我在Windows资源管理器中打开了有问题的文件夹,因此无法将其正确删除。

选择的答案似乎是一个黑客,因为它阻止您获得实际错误,而实际错误可能是一个严重错误

我可以使用删除内容,而不是像下面那样删除目录

 <MSBuild.ExtensionPack.FileSystem.Folder Condition="Exists( $(OutputPath) )"   TaskAction="RemoveContent" Path="$(OutputPath)" />


如果删除该条件,会发生什么情况?RemoveDir默认设置了ContinueOnError。@Ritch Melton-ContinueOnError似乎不是默认设置,添加ContinueOnError帮助,请参见下文。我已更正。对不起,我的错误信息。我有同样的问题,不久前,这是我必须解决的解决方案。这似乎有帮助!一个简单的想法很好地回避了这个问题,但我没有想到!谢谢
<MSBuild.ExtensionPack.FileSystem.Folder Condition="Exists( $(PathtoEmpty) )"
   TaskAction="RemoveContent" Path="$(PathtoEmpty)" />
<RemoveDir Directories="$(PathtoEmpty)" />
 <MSBuild.ExtensionPack.FileSystem.Folder Condition="Exists( $(OutputPath) )"   TaskAction="RemoveContent" Path="$(OutputPath)" />