我们的一个CruiseControl.NET项目间歇性地失败,因为msbuild任务失败并且
错误MSB3231:无法删除目录“d:\ Somewhere \ Dir \ Admin”。参数不正确。
相应的msbuild脚本行只是
<RemoveDir Directories="$(DistributionDir)\Admin" Condition="Exists('$(DistributionDir)\Admin')" />
当我在构建失败后查看状态时,目录内容已成功删除,但空目录本身就在那里。并且下一个构建通常会成功(必须只删除空目录)。请注意,问题似乎不是通常的“其他一些进程(如防病毒)保持锁定目录”,错误不是“访问被拒绝”,而是一个非常奇怪的“参数不正确”。
我使用SysInternals Process Monitor监视构建,结果很奇怪 - 一切都按预期进行,目录的内容被枚举,删除,当顶级目录枚举完成“没有更多文件”时,目录已关闭,并且......没有。没有其他操作进入过程监视器:
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 :(得分:9)
我不能说为什么会失败,但是如果文件夹是剩下的唯一的东西,那么构建是否正确完成?如果是这样,解决方法是指定ContinueOnError =“True”。
答案 1 :(得分:6)
尝试了很多东西,但是当目录不为空时我无法弄清楚为什么这有时会失败;在我们的例子中,如果重要,该目录包含符号链接。无论如何,我不喜欢使用ContinueOnError
,因为这意味着当您发现实际错误时,您不知道它,或者必须在每<Error Condition="Exists...
之后执行RemoveDir
之类的额外检查。我们现在使用的解决方案是明确地清空目录,之后msbuild似乎没有任何删除它的问题:
<MSBuild.ExtensionPack.FileSystem.Folder Condition="Exists( $(PathtoEmpty) )"
TaskAction="RemoveContent" Path="$(PathtoEmpty)" />
<RemoveDir Directories="$(PathtoEmpty)" />
答案 2 :(得分:5)
我自己刚刚遇到这个错误,结果发现我在Windows资源管理器中打开了违规文件夹,导致文件被无法正确删除。
答案 3 :(得分:2)
可能这有点晚了,但我发现了同样的错误,问题似乎出现在Exists条件下。似乎对条件的评估在某种程度上不会释放目录与任务的执行正确冲突 通过删除条件,如果目录存在,则将删除该目录,但如果该目录不存在,则该语句不会失败:
<RemoveDir Directories="$(DistributionDir)\Admin" />
答案 4 :(得分:0)
选择的答案似乎是一个黑客,因为它阻止你获得可能是一个严重错误的实际错误。
我可以使用删除内容,而不是删除目录,如下所示。
<MSBuild.ExtensionPack.FileSystem.Folder Condition="Exists( $(OutputPath) )" TaskAction="RemoveContent" Path="$(OutputPath)" />