2011-09-22 72 views
10

我们的一个CruiseControl.NET项目保持间断性地失效,因为MSBuild任务失败,的MSBuild“无法删除目录”

错误MSB3231:无法删除目录“d:\某处\导演\管理员”。该参数不正确。

相应的MSBuild脚本行只是

<RemoveDir Directories="$(DistributionDir)\Admin" Condition="Exists('$(DistributionDir)\Admin')" /> 

当我看着构建失败后,该目录内容被顺利取出的状态,但空目录本身是离开了那里。而下一次构建通常会成功(不得不删除空目录)。请注意,问题似乎不是通常的“一些其他进程(如防病毒)一直锁定目录”,错误不是“访问被拒绝”,但一个非常奇怪的“参数是不正确的”。

我使用SysInternals Process Monitor监视构建,结果很奇怪 - 一切如预期,目录的内容被枚举,删除,并且当顶层目录枚举以“NO MORE FILES”结束时,该目录已关闭,并且...什么也没有。没有其他操作获取到进程监视器:

10:04:09,9190557 MSBuild.exe 3516 QueryDirectory D:\Somewhere\Dir\Admin NO MORE FILES 
10:04:09,9190928 MSBuild.exe 3516 CloseFile  D:\Somewhere\Dir\Admin SUCCESS 

下一个(成功)建立的尝试只是一个无聊的成功目录去除:

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目录,没有任何变化。)

所以 - 任何想法的问题可能是或应该如何进一步调查?

(我不知道在哪里这个问题应该已经走了,这是一种SO之间的某处,progs的SE,服务器故障,超级用户...)

+0

如果删除条件会发生什么情况? RemoveDir默认设置了ContinueOnError。 –

+0

@Ritch Melton - ContinueOnError似乎不是默认值,添加了ContinueOnError帮助,见下文。 – Mormegil

+0

我站好了。对不起,不好的信息。 –

回答

9

我不能说为什么失败,但如果文件夹是唯一遗留下来的构建可以正确完成吗?如果是这样,一个解决方法是指定ContinueOnError =“True”。

+0

前段时间我有同样的问题,这是我必须解决的解决方案。 – skolima

+0

这似乎有帮助!一个简单的想法很好地回避了这个问题,它只是没有发生在我身上!谢谢! – Mormegil

2

可能会有点晚,但我找到了同样的错误,问题似乎在Exists条件中。似乎不知何故对条件的评估不会释放与任务执行相冲突的目录。如果存在
通过拆除条件的目录将被删除,但如果它不存在,语句也不会失败:

<RemoveDir Directories="$(DistributionDir)\Admin" />

+0

没有为我工作.. – stijn

+0

我刚试过这个,它的作品就像一个魅力。 –

6

尝试了很多东西,但我无法弄清楚为什么在目录不为空时有时失败;在我们的例子中,目录包含符号链接。无论如何,我不喜欢使用ContinueOnError,因为这意味着当你有一个实际的错误,你不知道它,或者每RemoveDir之后必须做一个额外的检查,如<Error Condition="Exists...。我们现在用的是要明确地清空目录的解决方案,在这之后的MSBuild似乎不具有移除任何问题:

<MSBuild.ExtensionPack.FileSystem.Folder Condition="Exists($(PathtoEmpty))" 
    TaskAction="RemoveContent" Path="$(PathtoEmpty)" /> 
<RemoveDir Directories="$(PathtoEmpty)" /> 
5

我刚刚遇到这个错误我自己,原来我有违规文件夹在Windows资源管理器中打开并阻止它被正确删除。

0

选定的答案似乎是一个黑客,因为它阻止你得到实际的错误,这可能是一个严重的错误。

我可以使用删除内容,而不是删除目录,如下所示。

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