2011-09-22 19 views
10

हमारे CruiseControl.NET परियोजनाओं में से एक "निर्देशिका को निकालने में असमर्थ" रुक-रुक कर नाकाम रहने के कारण एक MSBuild कार्य के साथMSBuild

त्रुटि MSB3231 विफल रहता है रखता है: निर्देशिका ": \ कहीं \ डिर \ व्यवस्थापक घ" निकाला जा सका। पैरामीटर गलत है।

इसी MSBuild स्क्रिप्ट लाइन बस

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

जब मैं राज्य में विफल रहा है निर्माण के बाद, निर्देशिका सामग्री सफलतापूर्वक हटा दिया गया था पर देखने के लिए है, लेकिन खाली निर्देशिका वहीं छोड़ दिया है। और अगला निर्माण आमतौर पर सफल होता है (केवल खाली निर्देशिका को हटाने के लिए)। ध्यान दें कि समस्या सामान्य नहीं लगती है "कुछ अन्य प्रक्रिया (जैसे एंटीवायरस) निर्देशिका को लॉक रखती है", त्रुटि "पहुंच से वंचित नहीं है", लेकिन एक बहुत अजीब "पैरामीटर गलत है"।

मैंने SysInternals प्रक्रिया मॉनीटर के साथ निर्माण की निगरानी की, और परिणाम अजीब है - सब कुछ अपेक्षित है, निर्देशिका की सामग्री को समझा जाता है, हटा दिया जाता है, और जब शीर्ष-स्तरीय निर्देशिका गणना "कोई और फाइल" के साथ समाप्त होती है, निर्देशिका बंद है, और ... कुछ भी नहीं।

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/विंडोज किसी तरह का पता लगाता है कोई अन्य संचालन प्रक्रिया पर नजर रखने के लिए हो जाता है निर्देशिका निष्कासन निष्पादित होने से पहले अमान्य पैरामीटर त्रुटि का, लेकिन मुझे नहीं पता कि कहां देखना है। (मैंने chkdsk चलाने की भी कोशिश की है, कुछ भी नहीं मिला। मैंने माता-पिता डी: \ कहीं और \ Dir निर्देशिका को भी हटा दिया है और फिर से बनाया है।)

तो - कोई विचार जहां समस्या हो सकती है या मुझे कैसे होना चाहिए आगे की जांच करो?

(मुझे यकीन है कि जहां इस सवाल से चले गए हैं चाहिए नहीं कर रहा हूँ, यह एक तरह से इतना बीच में कहीं है, progs एसई, सर्वर फॉल्ट, सुपर उपयोगकर्ता ...)

+0

यदि आप स्थिति को हटाते हैं तो क्या होता है? RemoveDir डिफ़ॉल्ट रूप से जारी हैऑनररर सेट है। –

+0

@ रिच मेलटन - जारी रखेंऑनरर डिफ़ॉल्ट नहीं प्रतीत होता है, ContinueOnError को जोड़ने में मदद करें, नीचे देखें। – Mormegil

+0

मैं सही खड़ा हूँ। बुरी जानकारी के लिए खेद है। –

उत्तर

9

मैं नहीं कह सकता कि ऐसा क्यों विफल हो रहा है, लेकिन अगर फ़ोल्डर एकमात्र चीज़ है जो निर्माण को सही तरीके से पूरा कर सकता है? यदि ऐसा है, तो ContinueOnError = "True" निर्दिष्ट करने के लिए एक वर्कअराउंड होगा।

+0

मुझे कुछ समय पहले एक ही समस्या थी और यह वह समाधान था जिसे मुझे व्यवस्थित करना पड़ा। – skolima

+0

यह मदद करने लगता है! एक साधारण विचार अच्छी तरह से इस मुद्दे को दूर कर रहा है, यह मेरे लिए नहीं हुआ! धन्यवाद! – Mormegil

2

हो सकता है यह देर से एक छोटे से आता है, लेकिन मैंने पाया वही त्रुटि और समस्या हालत मौजूद है में प्रतीत होता है। ऐसा लगता है कि किसी भी तरह की स्थिति का मूल्यांकन कार्य को निष्पादित करने के साथ निर्देशिका को ठीक तरह से विवादित नहीं करता है।
हालत निर्देशिका को हटाकर हटा दिया जाएगा अगर यह मौजूद है, लेकिन बयान असफल नहीं हो जाएगा अगर यह मौजूद नहीं है:

<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

मैं सिर्फ यह अपने आप त्रुटि का सामना किया, यह पता चला कि मैं अपमानजनक था एक विंडोज एक्सप्लोरर में फ़ोल्डर खोला गया और इसे ठीक से हटाए जाने से रोका।

0

चयनित उत्तर एक हैक प्रतीत होता है, क्योंकि यह आपको वास्तविक त्रुटि प्राप्त करने से रोकता है जो एक गंभीर त्रुटि हो सकती है।

मैं नीचे निर्देशिका को हटाने के बजाय हटाने सामग्री का उपयोग कर सकता हूं।

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