2011-09-22 71 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)" />