PowerShell 2.0 ile bir dizinin tamamını yinelemeli olarak nasıl silebilirim?


308

PowerShell'de bir dizini ve tüm alt dizinlerini zorla silmenin en basit yolu nedir? Windows 7'de PowerShell V2 kullanıyorum.

Birkaç kaynaktan, en bariz komutun, Remove-Item $targetDir -Recurse -Forcedüzgün çalışmadığını öğrendim . Bu, PowerShell V2 çevrimiçi yardımında (kullanılarak bulundu Get-Help Remove-Item -Examples) aşağıdaki ifadeleri içerir :

... Bu cmdlet'deki Recurse parametresi hatalı olduğundan, komut, istenen dosyaları almak için Get-Childitem cmdlet'ini kullanır ve bunları Kaldır-Öğesi cmdlet'ine iletmek için boru hattı işlecini kullanır ...

Get-ChildItem kullanan ve Kaldır-Öğe için boru çeşitli örnekler gördüm , ancak örnekler genellikle tüm dizin değil, bir filtreye dayalı bazı dosyaları kaldırmak.

Ben en az kod kullanarak herhangi bir kullanıcı uyarı mesajları oluşturmadan, tüm bir dizin, dosya ve alt dizinleri patlatmak için en temiz yolu arıyorum. Eğer anlaşılması kolaysa, bir astar iyi olurdu.


2
powershell, biliyorum, amaRD /S /Q
Rubens Farias


Bunun bir kopya olduğunu sanmıyorum. Göndermeden önce 1667145'i inceledim. Özel bir PowerShell sağlayıcısının Remove-Item yöntemi uygulamasını çağırırken, PowerShell'in neden Recurse bool parametresini düzgün ayarlayamadığını soruyor. Yerleşik dosya sistemi sağlayıcısı ile ilgili olarak Kaldır-Öğe davranışı hakkında soruyordum.
Matt Spradley

2
"RD / S / Q" PowerShell'de çalışmıyor gibi görünüyor - "Remove-Item: '/ q' argümanını kabul eden konumsal bir parametre bulunamıyor."
BrainSlugs83

5
rdRemove-Itempowershell için bir takma addır. cmd /c "rd /s /q"Yine de çalışıyor.
codekaizen

Yanıtlar:


510
Remove-Item -Recurse -Force some_dir

gerçekten burada ilan edildiği gibi çalışır.

rm -r -fo some_dir

aynı zamanda kestirme stillerdir.

Anladığım kadarıyla, -Recursefiltrelenmiş bir dosya kümesini tekrar tekrar silmeye çalıştığınızda parametre doğru şekilde çalışmıyor. Tek bir diri ve altındaki her şeyi öldürmek için iyi çalışıyor gibi görünüyor.


5
Bence haklısın. "Kullanımda olduğu için 'bazı dizin' öğesinden kaldırılamıyor" alıyordum. hata ve bunun özyineleme algoritmasıyla ilgili bir sorun olduğunu ve bir geçici çözüm aramaya başladığını varsayar. Görünüşe göre hedef dizinde çalıştığım komut dosyasında daha önce işten attığım bir süreç vardı. Komut dosyası diğer işlemi beklemek için değiştirildiğinde "Remove-Item -Recurse -Force" komutu çalışır. Her zaman önce aynaya bakın :)
Matt Spradley

15
Ben alt dizinleri içeren bir dizinde çalıştırırken bu iki kez çalıştırmak gerektiğini buldum. İlk seferinde birçok "dizin boş değil" hatası olacaktır. İkinci kez, hatasız tamamlanır.
Kristopher Johnson

5
Kristopher Johnson, Windows 7'de değişen araçlarla benzer hatalar alıyorum. Silme çağrısının bir dosya veya klasörden daha önce geri döndüğü anlaşılıyor ve bazen sorun yaratıyor. Bu Explorer, Far, cmd ve PowerShell'de gerçekleşiyor gibi görünüyor.
Joey

2
@Joey "Silme çağrısı bir dosya veya klasörden daha önce çıkarılmış gibi görünüyor ve bazen sorun yaratıyor." -> Açıklama için: ana klasör silinmeyecek ve biri şu hatayı alıyor: "[ana klasör] boş olmadığı için kaldırılamıyor." Bunun sürekli (yavaş) ağ bağlantılı sürücülerde gerçekleştiğini görüyorum. Tek çözüm eskidir: cmd /c rdaşağıda belirtildiği gibi.
Davor Josipovic

6
"Dizin boş değil" hataları ne olacak? serverfault.com/questions/199921/powershell-remove-force Belki daha iyi get-childitem * -include * .csv -recurse | bilmiyorum öğeyi kaldır. Bkz. Stackoverflow.com/a/1668471/206730
Kiquenet

39

Kullandım:

rm -r folderToDelete

Bu benim için bir cazibe gibi çalışır (Ben Ubuntu çaldı).


Bu, cygwin, git veya Windows'ta bir bash kabuğunu simüle edebilecek başka bir araç gerektirmez mi?
Pete

19
@Pete, hayır, PowerShell'den başka bir şey gerektirmez. PowerShell'in varsayılan yapılandırmasında rmkullanılan bir takma Remove-Itemaddır. Get-Alias rmDaha fazla ayrıntı için çıkışını kontrol edin . -rParametrelere PowerShell en kısmi eşleme davranışının faydalanıyor. Yana Remove-Itemtek parametresi vardır bir 'r' ile başlar, o -Recurse, -ro eşleşir. Böylece, aşağıdaki tüm aynı şekilde çalışacaktır: rm -r, rm -re, Remove-Item -Recurse. (Ne olduğunu Not rm -rfne de rm -r -fçalışır, ancak rm -r -fo. Will -rfparametre ve maçları -fBirden fazla eşleşmeleri.)
chwarr

1
Peki ya bu. "Remove-Item -Recurse -Force some_dir" için Powershell rm diğer adı, doğrudan remove-item kullanmaktan daha iyidir. Aynı hataları aldım "'bazı dizin' öğesinden kaldırılamıyor. Remove-item'den rm -r'ye hatasız olarak geçiyorum !?
Greg

İlginç. Kutumda cygwin araçları var ve denedim rm -rf folderve elbette başarısız oldu. Başlangıçta cevabı oyladım (çünkü Ubuntu dedi). @Chwarr tarafından yapılan yorum sayesinde, ben olmadan denedim fve rm ikili yerine takma adı aldı. Keşke Tuan kaynağını güncellemesini dilerdim (Tuan'ın bir takma ad olduğunu biliyor muydu ya da gerçekten unix rm olduğunu düşündüğünden emin değilim ;-)
Joshua Ball

2
Belki de -Ryerine kullanıyorum çünkü -r(bildiğim kadarıyla PowerShell Windows'un geri kalanı büyük / küçük harfe duyarlı değildir, bu yüzden bir fark yaratmamalıdır) ama silmeye çalıştığım klasörlerin boş değil.
rbaleksandar

25

Basit kullanarak dosyaları tekrar tekrar silerken Remove-Item "folder" -Recursebazen aralıklı bir hata görüyorum:[folder] cannot be removed because it is not empty.

Bu yanıt, dosyaları tek tek silerek bu hatayı önlemeye çalışır.

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

Önemli bir ayrıntı, pspath -Descendingyaprakların köklerden önce silinmesi için tüm öğelerin sıralanmasıdır . pspathDosya sistemi dışındaki sağlayıcılar için çalışma şansı daha fazla olduğundan, sıralama parametre üzerinde yapılır . -IncludeSilmek öğeleri filtrelemek istiyorsanız parametre sadece bir kolaylık.

Çalıştırarak silmek üzere olduğum şeyi görmeyi yararlı bulduğum için iki işleve ayrıldı

Get-Tree some_dir | select fullname

1
TFS derleme komut dosyalarında PowerShell kullanarak bir sorunu çözerken, bunun doğru yanıt olduğu kanıtlandı.
rcabr

Bu benim için de bir çözüm. Kendinize puan verin iyi adamım!
Jammer

Benim için çalıştı. Bir klasörün içeriğini yinelemeden silemedim, ancak çözümünüz benim için çalıştı. teşekkürler
SheldonH

Bu çok sağlam bir çözüm
Max Young

Kabul edilen cevabın neden bu kadar çok oyu olduğundan emin değilim - kişisel olarak hala remove-item -recursePowershell v5'te aralıklı hatalar alıyorum, bu yüzden bu çözüm benim için en iyisi.
JonoB


11

Bu örneği deneyin. Dizin yoksa, hata oluşmaz. PowerShell v3.0'a ihtiyacınız olabilir.

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

7

Eski DOS komutunu kullanın:

rd /s <dir>

Bu bir komut dosyasının parçasıysa, /q(Sessiz mod, / S ile bir dizin ağacını kaldırmak için sorun olup olmadığını sormayın) kullanmanız gerekir.
16:57

6

Nedense John Rees'ın cevabı bazen benim durumumda işe yaramadı. Ama beni şu yönde yönlendirdi. İlk önce buggy -recurse seçeneğiyle dizini yinelemeli olarak silmeye çalışıyorum. Daha sonra kalan her alt dizine iner ve tüm dosyaları silerim.

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

İşlevlerimi çalıştırırken hatayı yeniden oluşturabilir misiniz? Onları iyileştirmek için bilmek istiyorum.
John Rees

Üzgünüz, kesin ayarı hatırlamıyorum. : / Sanırım birden fazla alt dizin söz konusu olduğunda. "Remove-Item -force -recurse" çağrısı tüm dosyaları silmedi ve bu durumda dizini boş olmadığı için son Remove-Tree başarısız oldu. Bu yüzden önce buggy yerleşik sürümünü denemek için yeni bir çözüm buldum (-force) ve sonra her dizine manuel olarak iniyor ve kalanları "manuel" siliyor. Bu sürüm düzenli olarak kullanılmaktadır ve şimdiye kadar çalışmaktadır. Başarısız olmasının tek nedeni, bir programın bir dizin için hala tutamaç tutmasıydı.
jdoose

5

Kabul edilen yanıtın "Dizin boş değil" hatalarından kaçınmak için, daha önce önerildiği gibi eski eski DOS komutunu kullanmanız yeterlidir. Kopya yapıştırmaya hazır tam PS sözdizimi:

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

3
Hala klasörler için "Dizin boş değil" hatası veriyor !?
Oncel Umut TURER

2

Yukarıda @ john-rees'ten esinlenen başka bir yaklaşım aldım - özellikle yaklaşımı benim için bir noktada başarısız olmaya başladığında. Temel olarak alt ağacı geri alın ve dosyaları yol uzunluklarına göre sıralayın - en uzuntan en kısaa doğru silin

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 büyüsü ile ilgili olarak, size vurabilecek başka bir gotchya: https://superuser.com/q/212808


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

VEYA

remove-item <dir> -Recurse -Force

Eğer büyük bir dizininiz varsa, genellikle yaptığım şey

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

Bunu başka bir powershell terminalinde çalıştırın ve bittiğinde duracaktır.


İzleme ile ilgili fikrinizin yararlı olabileceğini kabul ediyorum, ancak bittikten sonra sadece bir mesaj yazdırmaktan neredeyse farklı değil ve Kaldır-Öğeyi durdurmada herhangi bir sorun olması durumunda, döngünüz asla bitmeyecek.
Raúl Salinas-Monteagudo

@ RaúlSalinas-Monteagudo doğru ama kesinlikle eşya ya da gözetimsiz kullanım senaryosu içindir. Birisi sadece hatırlamak ve hareket halindeyken yazmak ve sadece bir dizine sofistike bir .ps1 dosyası çalıştırmak için yeterince küçük olmalıdır.
Gajendra D Ambi

2

Klasör ağacının tamamını silmek bazen işe yarar ve bazen "Dizin boş değil" hatalarıyla başarısız olur. Daha sonra klasörün hala var olup olmadığını kontrol etmeye çalışmak "Erişim Reddedildi" veya "Yetkisiz Erişim" hatalarına neden olabilir. Bu StackOverflow gönderisinden bazı bilgiler elde edilebilir olsa da, bunun neden olduğunu bilmiyorum .

Klasördeki öğelerin silinme sırasını belirterek ve gecikmeler ekleyerek bu sorunları çözebildim. Aşağıdaki benim için iyi çalışır:

# 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'de Hesaplanan Özellikler'i kullanan bir Microsoft TechNet makalesi , derinliğe göre sıralanmış alt klasörlerin listesini almakta bana yardımcı oldu.

Benzer güvenilirlik sorunları RD / S / S çalıştırarak çözülebilir DEL / G / B / Q önce RD / S / S ve çalışan RD kullanarak yani (ideal bir duraklama arasında - bir ikinci zaman gerektiğinde ping gösterildiği gibi altında).

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

Gerçekten basit:

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

Siz de örnek bir yürütme sunmalısınız.
bölünmez

1

Başka bir yararlı hile:

Aynı veya benzer ad kuralına sahip çok sayıda dosya bulursanız (nokta önek adına sahip mac dosyası gibi ... o ünlü dosya çekme), bunları tek bir satırla kolayca powershell'den kaldırabilirsiniz:

ls -r .* | rm

Bu satır, geçerli dizinin içindeki adın başlangıcında nokta bulunan tüm dosyaları ve bu dizindeki diğer klasörlerin içinde aynı koşullara sahip tüm dosyaları da kaldıracaktır. Kullanırken bunun farkında olun. : D


Neden kullanmıyorsunuz rm -rf .*? Test etmek için gücüm yok, ama işe yarayacağını düşünüyorum.
Vini.g.fer

1
Bu kolay; "| rm" yi komuttan kaldırırsanız, sileceğiniz şeyin tüm panoramasını görüntüleyebilirsiniz, emin olduktan sonra komutu tamamlayabilirsiniz.
Daniel Alberto Lepe Ayala

Tarafından cierto, para quitar los archivos que empiecen con punto, (como los de mac) pero que tengan propiedad de oculto, İngilizce usar: ls -r -h. * | rm
Daniel Alberto Lepe Ayala

1

Klasör yapısı da dahil olmak üzere tüm içeriği silmek için şunu kullanın:

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

-recurseEklenen remove-itemetkileşimli istemleri devre dışı olmasını sağlar.


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

Üst dizini silmeden bazı günlük dosyalarını temizlemek için yukarıdakileri yazdınız ve bu mükemmel bir şekilde çalışır!


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

1
Lütfen başkalarının cevabınızdan öğrenebilecekleri şekilde daha fazla açıklayın
Nico Haase
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.