[windows] PowerShell 2.0 के साथ एक संपूर्ण निर्देशिका को दोबारा कैसे हटाएं?



Answers

मैंनें इस्तेमाल किया:

rm -r folderToDelete

यह मेरे लिए एक आकर्षण की तरह काम करता है (मैंने इसे उबंटू से चुरा लिया)।

Question

PowerShell में एक निर्देशिका और इसकी सभी उपनिर्देशिका को मजबूती से हटाने का सबसे आसान तरीका क्या है? मैं विंडोज 7 में पावरशेल वी 2 का उपयोग कर रहा हूं।

मैंने कई स्रोतों से सीखा है कि सबसे स्पष्ट कमांड, Remove-Item $targetDir -Recurse -Force , सही तरीके से काम नहीं करता है। इसमें PowerShell V2 ऑनलाइन सहायता में एक बयान शामिल है ( Get-Help Remove-Item -Examples का उपयोग करके पाया गया) जो कहता है:

... क्योंकि इस cmdlet में रिकर्स पैरामीटर दोषपूर्ण है, वांछित फ़ाइलों को प्राप्त करने के लिए आदेश Get-Childitem cmdlet का उपयोग करता है, और यह निकालें-आइटम cmdlet को पास करने के लिए पाइपलाइन ऑपरेटर का उपयोग करता है ...

मैंने विभिन्न उदाहरण देखे हैं जो Get-ChildItem का उपयोग करते हैं और इसे निकालें-आइटम पर पाइप करते हैं, लेकिन उदाहरण आमतौर पर फ़िल्टर के आधार पर फ़ाइलों के कुछ सेट को हटाते हैं, न कि संपूर्ण निर्देशिका।

मैं कम से कम कोड का उपयोग कर किसी भी उपयोगकर्ता चेतावनी संदेश उत्पन्न किए बिना, संपूर्ण निर्देशिका, फ़ाइलों और बाल निर्देशिकाओं को उड़ाने का सबसे साफ तरीका ढूंढ रहा हूं। यदि एक समझने में आसान हो तो एक लाइनर अच्छा होगा।




rm -r ./folder -Force    

... मेरे लिए काम किया




कुछ कारणों से जॉन रीस का जवाब कभी-कभी मेरे मामले में काम नहीं करता था। लेकिन यह मुझे निम्नलिखित दिशा में ले गया। सबसे पहले मैं छोटी गाड़ी-रिकर्स विकल्प के साथ निर्देशिका को हटाने की कोशिश करता हूं। बाद में मैं हर उपदिर में उतरता हूं जो सभी फाइलों को छोड़ देता है और हटा देता है।

function Remove-Tree($Path)
{ 
    Remove-Item $Path -force -Recurse -ErrorAction silentlycontinue

    if (Test-Path "$Path\" -ErrorAction silentlycontinue)
    {
        $folders = Get-ChildItem -Path $Path –Directory -Force
        ForEach ($folder in $folders)
        {
            Remove-Tree $folder.FullName
        }

        $files = Get-ChildItem -Path $Path -File -Force

        ForEach ($file in $files)
        {
            Remove-Item $file.FullName -force
        }

        if (Test-Path "$Path\" -ErrorAction silentlycontinue)
        {
            Remove-Item $Path -force
        }
    }
}



इस उदाहरण का प्रयास करें। यदि निर्देशिका मौजूद नहीं है, तो कोई त्रुटि नहीं उठाई जाती है। आपको PowerShell v3.0 की आवश्यकता हो सकती है।

remove-item -path "c:\Test Temp\Test Folder" -Force -Recurse -ErrorAction SilentlyContinue



वास्तव में सरल:

remove-item -path <type in file or directory name>, press Enter



PowerShell का उपयोग सभी फाइलों और फ़ोल्डरों को हटाने के लिए करता है

निकालें-आइटम -पथ "सी: \ डॉटनेट-हेल्पर्स *। *" -क्रिकर्स

रिकर्स नीचे ड्रिल करता है और बहुत अधिक फाइलें पाता है। - रिकर्स पैरामीटर PowerShell को अनुमति मांगे बिना किसी भी बच्चे के आइटम को हटाने की अनुमति देगा। इसके अतिरिक्त, छुपा या केवल-पढ़ने वाली फ़ाइलों को हटाने के लिए -force पैरामीटर जोड़ा जा सकता है।

-फोर्स कमांड का उपयोग करके हम पूरी तरह से फाइलों को हटा सकते हैं

PowerShell का उपयोग पूरी तरह से सभी फाइल बल को हटाने के लिए करता है

निकालें-आइटम -पथ "सी: \ डॉटनेट-हेल्पर्स *। *" -फोर्स

उदाहरण के साथ: http://dotnet-helpers.com/powershell-demo/how-to-delete-a-folder-or-file-using-powershell/




कभी-कभी एक संपूर्ण फ़ोल्डर पेड़ को हटाना कभी-कभी काम करता है और कभी-कभी "निर्देशिका खाली नहीं" त्रुटियों में विफल रहता है। इसके बाद यह जांचने का प्रयास कर रहा है कि फ़ोल्डर अभी भी मौजूद है या नहीं, "एक्सेस अस्वीकृत" या "अनधिकृत एक्सेस" त्रुटियों का परिणाम हो सकता है। मुझे नहीं पता कि ऐसा क्यों होता है, हालांकि इस स्टैक ओवरफ्लो पोस्टिंग से कुछ अंतर्दृष्टि प्राप्त की जा सकती है।

मैं ऑर्डर निर्दिष्ट करके इन मुद्दों को हल करने में सक्षम हूं जिसमें फ़ोल्डर के भीतर आइटम हटा दिए जाते हैं, और देरी जोड़कर। निम्नलिखित मेरे लिए अच्छा चलाता है:

# First remove any files in the folder tree
Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Where-Object { -not ($_.psiscontainer) } | Remove-Item –Force

# Then remove any sub-folders (deepest ones first).    The -Recurse switch may be needed despite the deepest items being deleted first.
ForEach ($Subfolder in Get-ChildItem -LiteralPath $FolderToDelete -Recurse -Force | Select-Object FullName, @{Name="Depth";Expression={($_.FullName -split "\\").Count}} | Sort-Object -Property @{Expression="Depth";Descending=$true}) { Remove-Item -LiteralPath $Subfolder.FullName -Recurse -Force }

# Then remove the folder itself.  The -Recurse switch is sometimes needed despite the previous statements.
Remove-Item -LiteralPath $FolderToDelete -Recurse -Force

# Finally, give Windows some time to finish deleting the folder (try not to hurl)
Start-Sleep -Seconds 4

PowerShell में परिकलित गुणों का उपयोग करने वाला एक Microsoft TechNet आलेख गहराई से क्रमबद्ध उप-फ़ोल्डर की सूची प्राप्त करने में मेरे लिए सहायक था।

आरडी / एस / क्यू के साथ समान विश्वसनीयता मुद्दों को आरडी / एस / क्यू चलाने से हल किया जा सकता है - आदर्श रूप से बीच में एक विराम (यानी नीचे दिखाए गए पिंग का उपयोग करके)।

RD /S /Q "C:\Some\Folder\to\Delete" > nul
if exist "C:\Some\Folder\to\Delete"  ping -4 -n 4 127.0.0.1 > nul
if exist "C:\Some\Folder\to\Delete"  RD /S /Q "C:\Some\Folder\to\Delete" > nul



Related