msbuild"无法删除目录"

Mor*_*gil 11 cruisecontrol.net msbuild

我们的一个CruiseControl.NET项目间歇性地失败,因为msbuild任务失败了

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

相应的msbuild脚本行就是

<RemoveDir Directories="$(DistributionDir)\Admin" Condition="Exists('$(DistributionDir)\Admin')" />
Run Code Online (Sandbox Code Playgroud)

当我在构建失败后查看状态时,目录内容已成功删除,但空目录本身就在那里.并且下一个构建通常会成功(必须只删除空目录).请注意,问题似乎不是通常的"其他一些进程(如防病毒)保持锁定目录",错误不是"访问被拒绝",而是一个非常奇怪的"参数不正确".

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

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

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

似乎由于某种原因,MSBuild/Windows在执行目录删除之前检测到某种无效参数错误,但我不知道在哪里查看.(我也试过运行chkdsk,没有找到.我也删除并重新创建了父D:\ Somewhere\Dir目录,没有任何改变.)

那么 - 任何想法可能存在的问题或我应该如何进一步调查?

(我不确定这个问题应该去哪里,它介于SO,Progs SE,Server Fault,Superuser ......之间)

Ped*_*dro 9

我不能说为什么它失败了,但是如果文件夹是剩下的唯一的东西可以构建完全正确吗?如果是这样,解决方法是指定ContinueOnError ="True".


sti*_*ijn 6

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

<MSBuild.ExtensionPack.FileSystem.Folder Condition="Exists( $(PathtoEmpty) )"
   TaskAction="RemoveContent" Path="$(PathtoEmpty)" />
<RemoveDir Directories="$(PathtoEmpty)" />
Run Code Online (Sandbox Code Playgroud)


小智 5

我自己刚刚遇到这个错误,结果发现我在Windows资源管理器中打开了违规文件夹,导致无法正确删除它.