PowerShell 2.0 के साथ पूरी निर्देशिका को पुन: कैसे हटाएं?


308

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

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

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

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

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


2
powershell, मुझे पता है, लेकिनRD /S /Q
रूबेंस Farias


मुझे नहीं लगता कि यह कोई डुप्लिकेट है। मैंने पोस्ट करने से पहले 1667145 की समीक्षा की। यह पूछ रहा है कि क्यों PowerShell एक कस्टम PowerShell प्रदाता के निकालें-आइटम विधि कार्यान्वयन को कॉल करते समय Recurse बूल पैरामीटर को ठीक से सेट नहीं कर रहा है। मैं निकालें-आइटम व्यवहार के बारे में पूछ रहा था क्योंकि यह अंतर्निहित फ़ाइल सिस्टम प्रदाता से संबंधित है।
मैट स्प्रेडली

2
"RD / S / Q" पावरशेल में काम नहीं करता है - कहते हैं "निकालें-आइटम: एक स्थितीय पैरामीटर नहीं पाया जा सकता है जो तर्क '/ q' को स्वीकार करता है।"
BrainSlugs83

5
rdके लिए एक उपनाम है Remove-Itemcmd /c "rd /s /q"हालांकि काम करता है।
कोडकाइज़न

जवाबों:


510
Remove-Item -Recurse -Force some_dir

वास्तव में यहाँ विज्ञापित के रूप में काम करता है।

rm -r -fo some_dir

आशुलिपि उपनाम है कि काम भी कर रहे हैं।

जहां तक ​​मैंने इसे समझा, -Recurseपैरामीटर ठीक से काम नहीं करता है जब आप पुनरावर्ती रूप से फ़ाइलों के फ़िल्टर किए गए सेट को हटाने का प्रयास करते हैं। एक भी दिर को मारने के लिए और इसके नीचे सब कुछ ठीक काम करने लगता है।


5
मेरे विचार में तुम सही हो। मुझे "कुछ निर्देशिका में आइटम को हटा नहीं सकता" क्योंकि यह उपयोग में है। " त्रुटि और मान लिया कि यह पुनरावृत्ति एल्गोरिथ्म के साथ एक मुद्दा था और एक वर्कअराउंड की खोज में चला गया। यह पता चला है कि मेरे पास एक प्रक्रिया थी जिसे मैंने पहले स्क्रिप्ट में निकाल दिया था जो लक्ष्य निर्देशिका में काम कर रहा था। जब "प्रक्रिया-आइटम -Recurse -Force" कमांड काम करता है, तो दूसरी प्रक्रिया की प्रतीक्षा करने के लिए स्क्रिप्ट को बदल दिया। हमेशा दर्पण में पहले देखें :)
मैट स्प्रेडली

15
मैंने पाया है कि जब मुझे उपनिर्देशिका वाली निर्देशिका पर चलाया जाता है तो मुझे इसे दो बार चलाने की आवश्यकता होती है। पहली बार, "निर्देशिका खाली नहीं है" त्रुटियों का एक बहुत कुछ होगा। दूसरी बार, यह बिना किसी त्रुटि के पूरा होता है।
क्रिस्टोफर जॉनसन 20

5
क्रिस्टोफर जॉनसन, मुझे विंडोज 7 पर अलग-अलग टूल के साथ समान त्रुटियां मिलती हैं। ऐसा लगता है कि फ़ाइल या फ़ोल्डर से पहले डिलीट कॉल वास्तव में हटा दिया जाता है, जिससे कभी-कभी परेशानी होती है। यह एक्सप्लोरर, सुदूर, cmd और PowerShell में होता है।
जॉय

2
@ जॉय "ऐसा लगता है कि फ़ाइल या फ़ोल्डर की तुलना में डिलीट कॉल रिटर्न वास्तव में हटा दिया गया है, जिससे कभी-कभी परेशानी होती है।" -> स्पष्टीकरण के लिए: मूल फ़ोल्डर को हटाया नहीं जाएगा और किसी को निम्न त्रुटि मिलती है: "[मूल फ़ोल्डर] को हटाया नहीं जा सकता क्योंकि यह खाली नहीं है।" मैं देख रहा हूं कि यह (धीमी) नेटवर्क ड्राइव पर लगातार होता है। एकमात्र समाधान पुराना है: cmd /c rdजैसा कि नीचे बताया गया है।
जोसफोविक

6
"निर्देशिका खाली नहीं है" त्रुटियों के बारे में क्या है? serverfault.com/questions/199921/powershell-remove-force शायद बेहतर संतान प्राप्त करें * -include * .csv -recurse | हटाने-आइटम मुझे नहीं पता। देखें stackoverflow.com/a/1668471/206730
Kiquenet

39

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

rm -r folderToDelete

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


क्या इसके लिए cygwin, git, या कुछ अन्य टूल की आवश्यकता नहीं है जो विंडोज पर बैश शेल का अनुकरण कर सकते हैं?
पीट

19
@ पे, नहीं, इसके लिए पॉवरशेल के अलावा कुछ भी नहीं चाहिए। PowerShell के डिफ़ॉल्ट कॉन्फ़िगरेशन के rmलिए एक उपनाम Remove-Itemहै। Get-Alias rmअधिक विवरण के लिए आउटपुट की जाँच करें । -rमानकों पर PowerShell का आंशिक मेल व्यवहार का लाभ ले रहा है। चूंकि Remove-Itemकेवल एक पैरामीटर है जो 'r' से शुरू होता है -Recurse, -rजो कि मेल खाता है। इस प्रकार, सभी निम्नलिखित एक ही काम करेगा: rm -r, rm -re, Remove-Item -Recurse। (नोट है कि न तो rm -rfहै और न ही rm -r -fकाम करेंगे, लेकिन rm -r -fo। होगा -rfकोई पैरामीटर और मेल खाता है -fएक से अधिक मैच।)
chwarr

1
उस के बारे में कैसा है। "Remove-Item -Recurse -Force some_dir" के लिए Powershell rm उर्फ ​​सीधे हटाने-मद का उपयोग करने से बेहतर काम करता है। मुझे वही त्रुटियां प्राप्त हुईं "आइटम को 'कुछ निर्देशिका' में नहीं निकाला जा सकता। मैं बिना किसी त्रुटि के रिमूव-आइटम से rm -r पर स्विच करता हूँ !?
ग्रेग

दिलचस्प। मेरे पास मेरे बॉक्स पर साइबरविन टूल्स हैं, और कोशिश की थी rm -rf folderऔर निश्चित रूप से यह विफल रहा। मैंने शुरू में जवाब में वोट दिया (क्योंकि यह उबंटू ने कहा था)। @Chwarr द्वारा टिप्पणी के लिए धन्यवाद, मैंने इसके बिना कोशिश की fऔर इसने rm बाइनरी की बजाय उपनाम को उठाया। काश, टुआन अपने स्रोत को अपडेट करता (यकीन नहीं होता कि अगर टुआन जानता था कि यह एक उपनाम है या वास्तव में सोचा था कि यह यूनिक्स आरएम ;-) है
जोशुआ बॉल

2
शायद ऐसा इसलिए है क्योंकि मैं -Rइसके बजाय का उपयोग करता हूं -r(हालांकि जहां तक ​​मुझे पता है कि PowerShell बाकी विंडोज की तरह है, केस-संवेदी नहीं है, इसलिए इससे कोई फर्क नहीं पड़ना चाहिए) लेकिन मुझे एक त्रुटि मिली कि मैं जिन फ़ोल्डरों को हटाने की कोशिश कर रहा हूं, वे हैं खाली नहीं।
rbaleksandar

25

जब Remove-Item "folder" -Recurseमैं एक सरल का उपयोग करके पुनरावर्ती फ़ाइलों को हटा रहा हूं तो मुझे कभी-कभी एक रुक-रुक कर त्रुटि दिखाई देती है:[folder] cannot be removed because it is not empty.

यह उत्तर व्यक्तिगत रूप से फ़ाइलों को हटाने के द्वारा उस त्रुटि को रोकने का प्रयास करता है।

function Get-Tree($Path,$Include='*') { 
    @(Get-Item $Path -Include $Include -Force) + 
        (Get-ChildItem $Path -Recurse -Include $Include -Force) | 
        sort pspath -Descending -unique
} 

function Remove-Tree($Path,$Include='*') { 
    Get-Tree $Path $Include | Remove-Item -force -recurse
} 

Remove-Tree some_dir

एक महत्वपूर्ण विवरण सभी वस्तुओं की छंटाई है, pspath -Descendingताकि पत्तियों को जड़ों से पहले हटा दिया जाए। सॉर्टिंग pspathपैरामीटर पर की जाती है क्योंकि इसमें फ़ाइल सिस्टम के अलावा अन्य प्रदाताओं के लिए काम करने की अधिक संभावना होती है। -Includeपैरामीटर सिर्फ एक सुविधा है, तो आप आइटम फिल्टर करने के लिए हटाना चाहते हैं है।

इसे दो कार्यों में विभाजित किया गया है क्योंकि मुझे यह देखने के लिए उपयोगी लगता है कि मैं क्या चलाकर हटाने वाला हूं

Get-Tree some_dir | select fullname

1
TFS बिल्ड स्क्रिप्ट में PowerShell का उपयोग करके किसी समस्या को हल करते समय, यह सही उत्तर साबित हुआ।
आरकेआरआर

मेरे लिए भी यही उपाय है। अपने आप को मेरे अच्छे आदमी कुछ बिंदु है!
जैमर

मेरे लिए काम किया। मुझे फ़ोल्डर की सामग्री का पुनरावर्ती विलोपन नहीं मिला, लेकिन आपके समाधान ने मेरे लिए काम किया। धन्यवाद
शेल्डन एचएच

यह एक बहुत ही मजबूत उपाय है
मैक्स यंग

मुझे यकीन नहीं है कि स्वीकृत जवाब में इतने सारे वोट क्यों हैं - मुझे व्यक्तिगत रूप से अभी भी remove-item -recursePowershell v5 का उपयोग करने में आंतरायिक त्रुटियां मिलती हैं इसलिए यह समाधान मेरे लिए सबसे अच्छा है।
जॉनो


11

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

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

7

पुराने स्कूल DOS कमांड का उपयोग करें:

rd /s <dir>

यदि यह एक स्क्रिप्ट का हिस्सा है, तो आपको /q(क्विट मोड) का उपयोग करना होगा , यह न पूछें कि क्या डायरेक्ट ट्री को / S के साथ हटाना भी ठीक है।
Wildeyes

6

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

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
        }
    }
}

क्या आप मेरे कार्यों को चलाने के दौरान त्रुटि को पुन: उत्पन्न कर सकते हैं? मैं जानना चाहता हूं ताकि मैं उन्हें सुधार सकूं।
जॉन रीस

क्षमा करें, सटीक सेटिंग याद नहीं है। : / मुझे लगता है कि यह तब था जब कई उप-निर्देशिकाएं शामिल थीं। ऐसा हुआ कि "Remove-Item -force -recurse" कॉल सभी फ़ाइलों को हटा नहीं पाई और उस स्थिति में अंतिम निकालें-ट्री विफल हो गया क्योंकि निर्देशिका खाली नहीं थी। इसीलिए मैं नए समाधान के साथ आया, जिसमें पहले बने-इन-वर्जन (-फोर्स) में बग्गी को आज़माया गया था और फिर मैन्युअल रूप से प्रत्येक डायरेक्टरी में उतरते हुए और "मैन्युअल रूप से" को हटा दिया गया था। यह संस्करण नियमित रूप से और अब तक काम में है। एकमात्र कारण यह विफल रहा जब एक कार्यक्रम अभी भी एक निर्देशिका को संभालता है।
जॉडोज

5

स्वीकार किए गए उत्तर की "निर्देशिका खाली नहीं है" त्रुटियों से बचने के लिए, पहले दिए गए सुझाव के अनुसार अच्छे पुराने डॉस कमांड का उपयोग करें। कॉपी-चिपकाने के लिए तैयार पूर्ण PS वाक्यविन्यास है:

& cmd.exe /c rd /S /Q $folderToDelete

3
यह अभी भी फ़ोल्डर के लिए "निर्देशिका खाली नहीं है" त्रुटि देता है !?
ओनसेल उमुट टूरर

2

मैंने ऊपर @ john-rees से प्रेरित एक और दृष्टिकोण लिया - खासकर जब उसका दृष्टिकोण मेरे लिए कुछ बिंदु पर विफल होने लगा। मूल रूप से उप-पथ को पुन: व्यवस्थित करें और फ़ाइलों को उनके पथ-लंबाई के आधार पर क्रमबद्ध करें - सबसे लंबे समय तक सबसे छोटी से हटाएं

Get-ChildItem $tfsLocalPath -Recurse |  #Find all children
    Select-Object FullName,@{Name='PathLength';Expression={($_.FullName.Length)}} |  #Calculate the length of their path
    Sort-Object PathLength -Descending | #sort by path length descending
    %{ Get-Item -LiteralPath $_.FullName } | 
    Remove-Item -Force

-LiteralPath जादू के बारे में, यहाँ एक और गोटिया है जो आपको मार सकती है: https://superuser.com/q/212808


2
del <dir> -Recurse -Force # I prefer this, short & sweet

या

remove-item <dir> -Recurse -Force

यदि आपके पास एक विशाल निर्देशिका है तो मैं आमतौर पर क्या करता हूं

while (dir | where name -match <dir>) {write-host deleting; sleep -s 3}

इसे दूसरे पॉवरशेल टर्मिनल पर चलाएँ और जब यह हो जाएगा तब यह बंद हो जाएगा।


मैं मानता हूं कि निगरानी के साथ आपका विचार उपयोगी हो सकता है, लेकिन यह एक संदेश को पूरा करने से बमुश्किल अलग है, एक बार जब यह समाप्त हो जाता है, और यदि कोई चीज निकालें-आइटम को रोकने में कोई समस्या थी, तो आपका लूप कभी समाप्त नहीं होगा।
राउल सालिनास-मोंटियागुडो

@ RaúlSalinas-Monteagudo सच है, लेकिन यह निश्चित रूप से उपयोग या अप्रयुक्त उपयोग के मामले के परिदृश्य के लिए है। किसी के लिए बस याद रखना और चलते-फिरते टाइप करना बहुत छोटा होना है, न कि केवल एक डायरेक्टरी के लिए एक .ps1 फ़ाइल चलाना।
गजेंद्र डी अम्बी

2

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

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

# 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 आलेख गहराई से क्रमबद्ध उप-फ़ोल्डरों की सूची प्राप्त करने में मेरे लिए उपयोगी था।

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

DEL /F /S /Q "C:\Some\Folder\to\Delete\*.*" > nul
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

1

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

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

आपको एक उदाहरण निष्पादन भी प्रस्तुत करना चाहिए।
अविभाजित

1

एक और उपयोगी ट्रिक:

यदि आपको समान या समान नाम वाले कन्वेंशन के साथ बहुत सारी फाइलें मिलती हैं (जैसे मैक प्रीफिक्स नाम वाली मैक फाइल ... वह प्रसिद्ध फाइल पुलकेशन), तो आप उन्हें इस तरह से पॉवरशेल से एक सिंगल लाइन के साथ आसानी से हटा सकते हैं:

ls -r .* | rm

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


उपयोग क्यों नहीं rm -rf .*? मेरे पास परीक्षण करने के लिए शक्तियां नहीं हैं, लेकिन मुझे लगता है कि यह काम करेगा।
Vini.g.fer

1
यह आसान है; यदि आप कमांड से सिर्फ "| rm" को हटाते हैं, तो आप जो कुछ भी डिलीट करने जा रहे हैं, उसका पूरा पैनोरमा देख सकते हैं, यह सुनिश्चित करने के बाद, आप कमांड को पूरा कर सकते हैं।
डेनियल अल्बर्टो लेप आयला

पोर सीरटो, पैरा क्विटेर लॉस लॉस आर्किवोस क्यू एम्पियेन कोन पोटो, (कोमो लॉस डे मैक) पेरो क्यू टेंगान प्रोपिडैड डी ओकुल्टो, प्यूडेस यूएसर: एलएस-आर -एच। * | rm
डैनियल अल्बर्टो लेप आयला

1

फ़ोल्डर संरचना का उपयोग सहित पूरी सामग्री को हटाने के लिए

get-childitem $dest -recurse | foreach ($_) {remove-item $_.fullname -recurse}

-recurseकरने के लिए जोड़ा remove-itemसुनिश्चित इंटरैक्टिव संकेतों में अक्षम हैं।


-1
$users = get-childitem \\ServerName\c$\users\ | select -ExpandProperty name

foreach ($user in $users)

{
remove-item -path "\\Servername\c$\Users\$user\AppData\Local\Microsoft\Office365\PowerShell\*" -Force -Recurse
Write-Warning "$user Cleaned"
}

मूल निर्देशिका को हटाने के बिना कुछ लॉगफाइल्स को साफ करने के लिए ऊपर लिखा गया है और यह पूरी तरह से काम करता है!


-2
rm -r <folder_name>
c:\>rm -r "my photos"

1
कृपया समझाएं कि आगे ऐसा हो सकता है कि अन्य लोग आपके उत्तर से सीख सकें
निको हेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.