Jak usunąć pliki / podfoldery w określonym katalogu w wierszu polecenia w systemie Windows

308

Powiedzmy, że istnieje zmienna o nazwie %pathtofolder%, ponieważ wyjaśnia, że ​​jest to pełna ścieżka do folderu.

Chcę usunąć każdy pojedynczy plik i podfolder w tym katalogu, ale nie sam katalog.

Ale może wystąpić błąd, taki jak „ten plik / folder jest już używany” ... kiedy to nastąpi, powinien po prostu kontynuować i pominąć ten plik / folder.

Czy jest na to jakieś polecenie?

Deniz Zoeteman
źródło
Możliwy duplikat tego, co zdarzyło się deltree i co go zastępuje?
Rosberg Linhares
To szalone, jak trudne Windows sprawia, że ​​usuwanie folderów ... Lub tworzenie takiego, który zaczyna się od kropki ... Dzięki Bogu za integrację Bash z Windows! rm -rf path\to\folderdziała w systemie Windows 10 (lub może pochodzić z Git Bash ... tak czy inaczej, jeśli masz, warto spróbować!)
Stijn de Witt

Odpowiedzi:

256

Możesz użyć tego skryptu powłoki, aby wyczyścić folder i pliki w C:\Temp źródle :

del /q "C:\Temp\*"
FOR /D %%p IN ("C:\Temp\*.*") DO rmdir "%%p" /s /q

Utwórz plik wsadowy (powiedzmy delete.bat) zawierający powyższe polecenie. Przejdź do lokalizacji, w której znajduje się plik delete.bat, a następnie uruchom polecenie: delete.bat

Iain
źródło
20
Próbowałem, ale niestety pliki nie zostały usunięte, usuwane są tylko podfoldery. Na przykład mam folder o nazwie Test. Zawiera 2 foldery o nazwach „Ripon” i „Wasim” oraz plik o nazwie „riponalwasim.txt”. Podfoldery Ripon i Wasim zostały usunięte, ale plik riponalwasim.txt nie został usunięty.
Ripon Al Wasim,
16
Użyj pojedynczego znaku procentu, jeśli chcesz uruchomić bezpośrednio z wiersza poleceń, np.%p
Alex
2
Smutne, że zajmuje to 2 linie, ale przynajmniej działa! Mam już dość szukania działającego „liniowca” i pójdę z tym, dzięki!
nightcoder
2
Możesz użyć operatora „&&” do wykonania dwóch poleceń w jednym wierszu bez pliku nietoperza (zauważ pojedynczy „%” zamiast „%%”). del / s / q "myfolder *" && FOR / D% p IN ("myfolder *") DO rmdir "% p" / s / q
ravinsp
<for / F "delims =" %% i in ('dir / b / a-d') do (echo del "%% i" / q)> może pomóc w plikach (wystarczy usunąć to echo)
grenix
340

rmdir to moja ulubiona komenda do tego zadania. Działa do usuwania dużych plików i folderów z podfolderami. Kopia zapasowa nie została utworzona, więc upewnij się, że pliki zostały bezpiecznie skopiowane przed uruchomieniem tego polecenia.

RMDIR "FOLDERNAME" /S /Q

To po cichu usuwa folder oraz wszystkie pliki i podfoldery.

Suresh
źródło
65
To wydaje się usuwać ścieżkę do folderu, który OP chciał zachować.
Fuzz Evans,
4
Spowodowałoby to usunięcie samego folderu, więc musisz dodać kolejne polecenie: md FOLDERNAME(patrz odpowiedź z @rakoczyn poniżej).
thdoan
4
Co rozumiesz przez „tworzenie kopii zapasowej” tutaj? Nie widzę niczego, co stworzyłoby jakąkolwiek kopię zapasową ...
Paul Groke
1
Katalog nie jest pusty Wiadomość nadeszła w odpowiedzi!
Jamshaid Kamran,
10
Aby nie usuwać samego folderu, ustaw go wcześniej jako katalog bieżący, a następnie użyj „.” jako FOLDERNAME. Ponowne utworzenie go później niekoniecznie jest takie samo, ponieważ listy ACL mogą zostać utracone. cd "FOLDERNAME" RD . /S /Q
Moritz Oba
85

Najprostszym rozwiązaniem, jakie mogę wymyślić, jest usunięcie całego katalogu

RD /S /Q folderPath

Następnie ponownie utwórz ten katalog:

MD folderPath
wojciech_rak
źródło
5
co jeśli masz pozwolenie na usuwanie, ale nie tworzenie nowych folderów? Mam nadzieję, że to możliwe :)
Sandy
13
Jest to złe rozwiązanie, ponieważ wprowadza wyścig w systemie plików dla węzła katalogu, tzn. Drugie polecenie może się nie powieść, jeśli zostanie wykonane natychmiast po nim.
Rok Strniša
22
Również złe rozwiązanie jeśli katalog ma specjalne uprawnienia, po prostu nuked hm (ups)
Immortal Niebieski
Nie zniechęcaj się odpowiedzią: „Katalog nie jest pusty.”, Po prostu wydaj polecenie dwukrotnie :-)
Kieran Ryan
1
RD i RMDIR to to samo polecenie, a skoro opublikowałeś tę odpowiedź 9 miesięcy po tym, jak ktoś podał tę samą odpowiedź, dlaczego ludzie dają ci punkty?
Przełącz
51

Spowoduje to usunięcie folderów i plików i pozostawienie folderu za sobą.

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)
foxidrive
źródło
4
Dla każdego, kto nie ma pewności co do tego podejścia: zdecydowanie nie tworzy ponownie katalogu. Bez 2>nulwyświetla wynik „Proces nie może uzyskać dostępu do pliku, ponieważ jest używany przez inny proces”.
Rok Strniša
6
Nienawidzę tego, że Windows nie może usuwać plików i folderów używanych przez jakiś program. I uwielbiam to, że użyłeś tego na swoją korzyść w tym jednowarstwowym.
andref
Więc ta uber-magia to sposób, w jaki opróżniamy folder w systemie Windows? Imponujące :)
mlvljr 13.01.15
3
@mlvljr Tylko, jeśli chcesz zachować folder nadrzędny. RD /?pokaże ci prosty sposób na opróżnienie folderu.
foxidrive
1
Jest to miłe, jeśli musisz wrócić do miejsca początkowego, w przeciwnym razie CD mypath && RD /S .wystarczy. Nie podoba mi się, że musisz powtórzyć swoją ścieżkę dwa razy, w przypadku długich ścieżek staje się trudna do odczytania. Dodałbym więc tylko set p="mypath"na początku.
Amit Naidu
39
@ECHO OFF

SET THEDIR=path-to-folder

Echo Deleting all files from %THEDIR%
DEL "%THEDIR%\*" /F /Q /A

Echo Deleting all folders from %THEDIR%
FOR /F "eol=| delims=" %%I in ('dir "%THEDIR%\*" /AD /B 2^>nul') do rd /Q /S "%THEDIR%\%%I"
@ECHO Folder deleted.

EXIT

... usuwa wszystkie pliki i foldery pod danym katalogiem, ale nie sam katalog.

thepip3r
źródło
4
to powinna być właściwa odpowiedź ... po prostu uprość ... plik deletemyfoldercontents.bat .. pop na swojej drodze i działa jak urok ..
timbrown
3
W wierszu komend DEL brakuje opcji /Ausuwania również plików z ustawionym ukrytym atrybutem i %dir%\*powinny być ujęte w podwójne cudzysłowy, tak jak "%dir%\*"w przypadku katalogów zawierających spację lub jeden z tych znaków &()[]{}^=;!'+,`~. A wiersz poleceń FOR powinien zostać zmodyfikowany, for /F "eol=| delims=" %%I in ('dir "%dir%\*" /AD /B 2^>nul') do rd /Q /S "%dir%\%%I"ponieważ FOR ignoruje katalogi z ukrytym zestawem atrybutów. DIR z opcjami /AD /Bwyświetla wszystkie katalogi zawierające tylko ich nazwy. BTW: dirnie jest dobrą nazwą dla zmiennej środowiskowej.
Mofi
1
nie usuwa podfolderu
RMiranda,
1
@RMiranda, w moich testach robi dokładnie to, o co poprosił OP. Czy masz przypadek, w którym nie usuwa podfolderów?
thepip3r
Czy ta odpowiedź spełnia wymóg „może występować błąd, taki jak„ ten plik / folder jest już w użyciu ”... kiedy to nastąpi, należy po prostu kontynuować i pominąć ten plik / folder.” ?
Peter Mortensen
30
CD [Your_Folder]
RMDIR /S /Q .

Otrzymasz komunikat o błędzie, informujący, że polecenie RMDIR nie może uzyskać dostępu do bieżącego folderu, a zatem nie może go usunąć.

Aktualizacja :

Z tego użytecznego komentarza (dzięki Moritz Both ) możesz dodać &&między, więc RMDIRnie uruchomi się, jeśli CDpolecenie się nie powiedzie (np. Błędnie wpisana nazwa katalogu):

CD [Your_Folder] && RMDIR /S /Q .

Z wiersza polecenia systemu Windows :

/ S: usuwa drzewo katalogów (określony katalog i wszystkie jego podkatalogi, w tym wszystkie pliki).

/ Q: Określa tryb cichy. Nie wyświetla monitu o potwierdzenie podczas usuwania drzewa katalogów. (Zauważ, że / q działa tylko wtedy, gdy podano / s.)

O.Badr
źródło
1
Jest to idealne rozwiązanie do opróżniania temp, ale cd [Your_Folder]to bardzo krytyczne - muszę o tym pamiętać, więc nie usuwam samego katalogu ...
mędrzec
5
To jest właściwe rozwiązanie. Dodawaj &&między poleceniami zamiast podziału wiersza, aby zabezpieczyć się przed uszkodzeniem dysku CD.
Moritz Oba
To proste i poprawne rozwiązanie. Działa nawet z powłoką poleceń platformy Azure!
Philippe,
całkiem złe rozwiązanie ... Potrzebuję na przykład usunięcia tego wiersza polecenia dla aktualizacji svn - Chcę usunąć wszystkie pliki i foldery przed wykonaniem aktualizacji svn, ponieważ mogą istnieć pewne zmiany na komputerze, na którym ich używam, ale istotne są tylko zameldowanymi przedmiotami. Wykonanie RMDIR / S / Q. usuwa również łącze SVN i dlatego folder nie jest już folderem svn
Dominik Lemberger
Czym różni się to od czterech poprzednich odpowiedzi?
Peter Mortensen
9

RD oznacza REMOVE Directory.

/ S: Usuń wszystkie pliki i podfoldery oprócz samego folderu. Użyj tego, aby usunąć całe drzewo folderów.

/ Q: Quiet - nie wyświetlaj potwierdzenia YN

Przykład:

RD /S /Q C:/folder_path/here
Sireesh Yarlagadda
źródło
1
głosowano za to, że jako jedyny wyjaśnił, co /Si co /Qoznacza
SourceVisor
2
Nie. rdJest równoważne rmdiri usunie sam katalog i nie jest tym, czego chce OP.
WesternGun
Czy ta odpowiedź spełnia wymóg „może występować błąd, taki jak„ ten plik / folder jest już w użyciu ”... kiedy to nastąpi, należy po prostu kontynuować i pominąć ten plik / folder.”? Na przykład, czy przerywa całkowicie zamiast kontynuować?
Peter Mortensen
8

Używam PowerShell

Remove-Item c:\scripts\* -recurse

Spowoduje to usunięcie zawartości folderu, a nie samego folderu.

rhellem
źródło
Odpowiedź rhellema jest ostatnia, ale jest to jedyna odpowiedź, która faktycznie zrobi to dla mnie. (Wygraj 8.1, nie z wyboru)
philologon
2
Z wiersza polecenia partii:powershell -Command "Remove-Item 'PathToMyDirectory\*' -Recurse -Force"
Rosberg Linhares
Pamiętaj, że „*” jest konieczne, aby usunąć folder.
mhenry1384,
7

Żadna z odpowiedzi opublikowanych 01.01.2018, z wyjątkiem pojedynczego wiersza poleceń opublikowanego przez foxidrive , naprawdę usunęła wszystkie pliki i wszystkie foldery / katalogi w %PathToFolder%. To jest powód opublikowania jeszcze jednej odpowiedzi za pomocą bardzo prostego pojedynczego wiersza polecenia, aby usunąć wszystkie pliki i podfoldery folderu, a także plik wsadowy z bardziej złożonym rozwiązaniem wyjaśniającym, dlaczego wszystkie inne odpowiedzi opublikowane w dniu 06.06.2018 przy użyciu DEL i FOR z RD nie udało się całkowicie wyczyścić folderu.


Proste rozwiązanie z pojedynczym wierszem poleceń, które oczywiście można również wykorzystać w pliku wsadowym:

pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )

Ten wiersz poleceń zawiera trzy polecenia wykonywane jeden po drugim.

Pierwsze polecenie PUSHD wypycha bieżącą ścieżkę katalogu na stos, a następnie tworzy %PathToFolder%katalog bieżący do uruchomienia procesu poleceń.

Działa to również domyślnie dla ścieżek UNC, ponieważ rozszerzenia poleceń są domyślnie włączone, w tym przypadku PUSHD tworzy tymczasową literę dysku, która wskazuje na określony zasób sieciowy, a następnie zmienia bieżący dysk i katalog, używając nowo zdefiniowanej litery dysku.

PUSHD generuje następujący komunikat o błędzie, aby obsłużyć STDERR, jeśli określony katalog w ogóle nie istnieje:

System nie może odnaleźć określonej ścieżki.

Ten komunikat o błędzie jest pomijany przez przekierowanie go 2>nuldo urządzenia NUL .

Następne polecenie RD jest wykonywane tylko wtedy, gdy zmiana bieżącego katalogu dla bieżącego procesu poleceń na określony katalog zakończyła się powodzeniem, tzn. Podany katalog w ogóle istnieje.

Polecenie RD z opcjami /Qi cicho/S usuwa katalog ze wszystkimi podkatalogami, nawet jeśli określony katalog zawiera pliki lub foldery z ukrytym atrybutem lub z ustawionym atrybutem tylko do odczytu. Atrybut systemowy nigdy nie zapobiega usuwaniu pliku lub folderu.

Nie usunięte są:

  1. Foldery używane jako bieżący katalog dla dowolnego uruchomionego procesu. Całe drzewo folderów takiego folderu nie może zostać usunięte, jeśli folder jest używany jako katalog bieżący dla dowolnego uruchomionego procesu.

  2. Pliki aktualnie otwierane przez dowolny uruchomiony proces z uprawnieniami dostępu do pliku ustawionymi na plik otwarty, aby zapobiec usunięciu pliku podczas otwierania przez uruchomioną aplikację / proces. Taki otwarty plik zapobiega również usunięciu całego drzewa folderów do otwartego pliku.

  3. Pliki / foldery, w których bieżący użytkownik nie ma wymaganych uprawnień (NTFS), aby usunąć plik / folder, co zapobiega również usunięciu drzewa folderów do tego pliku / folderu.

Pierwszy powód, dla którego folder nie jest usuwany, służy do usuwania wszystkich plików i podfolderów określonego folderu, ale nie samego folderu. Folder jest tymczasowo bieżącym katalogiem do uruchamiania procesu poleceń, co uniemożliwia usunięcie samego folderu. Oczywiście powoduje to wyświetlenie komunikatu o błędzie przez polecenie RD :

Proces nie może uzyskać dostępu do pliku, ponieważ jest używany przez inny proces.

Plik jest tutaj złym terminem, ponieważ w rzeczywistości folder jest używany przez inny proces, bieżący proces polecenia, który wykonał polecenie RD . W rzeczywistości folder jest dla systemu plików specjalnym plikiem z katalogiem atrybutów pliku, który wyjaśnia ten komunikat o błędzie. Ale nie chcę zagłębiać się w zarządzanie systemem plików.

Ten komunikat o błędzie, podobnie jak wszystkie inne komunikaty o błędach, które mogą wystąpić z trzech opisanych powyżej powodów, jest pomijany przez przekierowanie go z 2>nuluchwytu STDERR na urządzenie NUL .

Trzecie polecenie POPD jest wykonywane niezależnie od wartości wyjściowej polecenia RD .

POPD usuwa ścieżkę katalogu wypchniętą przez PUSHD ze stosu i zmienia katalog bieżący w celu uruchomienia procesu komend na ten katalog, tzn. Przywraca początkowy katalog bieżący. POPD usuwa tymczasową literę dysku utworzoną przez PUSHD w przypadku ścieżki folderu UNC.

Uwaga: POPD może po cichu nie przywrócić początkowego katalogu bieżącego, w przypadku gdy początkowy katalog bieżący był podkatalogiem katalogu do czyszczenia, który już nie istnieje. W tym szczególnym przypadku %PathToFolder%pozostaje bieżący katalog. Dlatego wskazane jest, aby uruchomić powyższy wiersz poleceń, a nie z podkatalogu %PathToFolder%.

Jeszcze jeden interesujący fakt: wypróbowałem wiersz poleceń również przy użyciu ścieżki UNC, udostępniając lokalny katalog C:\Tempz nazwą udziału Tempi używając ścieżki UNC \\%COMPUTERNAME%\Temp\CleanTestprzypisanej do zmiennej środowiskowej PathToFolderw systemie Windows 7. Jeśli bieżący katalog podczas uruchamiania wiersza poleceń jest podkatalogiem udostępnionego lokalnego folderze dostępne przy użyciu ścieżki UNC, to znaczy C:\Temp\CleanTest\Subfolder1, Subfolder1są usuwane przez RD , a obok POPD nie cicho w podejmowaniu C:\Temp\CleanTest\Subfolder1ponownie bieżący katalog prowadzące Z:\CleanTestpozostałą jako bieżącego katalogu za prowadzenie procesu dowodzenia. Więc w tym bardzo szczególnym przypadku litera dysku tymczasowego pozostaje do momentu zmiany bieżącego katalogu, na przykład za pomocącd /D %SystemRoot%do istniejącego katalogu lokalnego. Niestety POPD nie kończy działania z wartością większą 0, jeśli nie uda się przywrócić początkowego katalogu bieżącego, co uniemożliwia wykrycie tego bardzo szczególnego warunku błędu przy użyciu tylko kodu wyjścia POPD . Można jednak przypuszczać, że nikt nigdy nie napotyka tak szczególnego przypadku błędu, ponieważ ścieżki UNC zwykle nie są używane do uzyskiwania dostępu do lokalnych plików i folderów.

Aby jeszcze lepiej zrozumieć używane polecenia, otwórz okno wiersza polecenia, wykonaj tam następujące polecenia i bardzo uważnie przeczytaj pomoc wyświetlaną dla każdego polecenia.

  • pushd /?
  • popd /?
  • rd /?

Jedna linia z wieloma poleceniami przy użyciu pliku wsadowego systemu Windows wyjaśnia operatorów &&i &użyto ich tutaj.


Następnie spójrzmy na rozwiązanie pliku wsadowego za pomocą polecenia DEL, aby usunąć pliki z %PathToFolder%oraz FOR i RD, aby usunąć podfoldery %PathToFolder%.

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Clean the folder for temporary files if environment variable
rem PathToFolder is not defined already outside this batch file.
if not defined PathToFolder set "PathToFolder=%TEMP%"

rem Remove all double quotes from folder path.
set "PathToFolder=%PathToFolder:"=%"

rem Consisted the folder path only of double quotes?
if not defined PathToFolder goto EndCleanFolder

rem Remove a backslash at end of folder path.
if "%PathToFolder:~-1%" == "\" set "PathToFolder=%PathToFolder:~0,-1%"

rem Consisted folder path only of a backslash (with one or more double quotes)?
if not defined PathToFolder goto EndCleanFolder

rem Delete all files in specified folder including files with hidden
rem or read-only attribute set, except the files currently opened by
rem a running process which prevents deletion of the file while being
rem opened by the application, or on which the current user has not
rem the required permissions to delete the file.
del /A /F /Q "%PathToFolder%\*" >nul 2>nul

rem Delete all subfolders in specified folder including those with hidden
rem attribute set recursive with all files and subfolders, except folders
rem being the current directory of any running process which prevents the
rem deletion of the folder and all folders above, folders containing a file
rem opened by the application which prevents deletion of the file and the
rem entire folder structure to this file, or on which the current user has
rem not the required permissions to delete a folder or file in folder tree
rem to delete.
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul

:EndCleanFolder
endlocal

Plik wsadowy najpierw upewnia się, że zmienna środowiskowa PathToFolderjest naprawdę zdefiniowana ze ścieżką folderu bez podwójnych cudzysłowów i bez odwrotnego ukośnika na końcu. Odwrotny ukośnik na końcu nie stanowiłby problemu, ale podwójne cudzysłowy w ścieżce folderu mogą być problematyczne, ponieważ wartość PathToFolderjest łączona z innymi łańcuchami podczas wykonywania pliku wsadowego.

Ważne są dwie linie:

del /A /F /Q "%PathToFolder%\*" >nul 2>nul
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul

Polecenie DEL służy do usunięcia wszystkich plików z określonego katalogu.

  • Ta opcja /Ajest niezbędna do przetworzenia naprawdę wszystkich plików, w tym plików z ukrytym atrybutem, które DEL zignorowałby bez użycia opcji /A.
  • Opcja /Fjest konieczna, aby wymusić usunięcie plików z ustawionym atrybutem „tylko do odczytu”.
  • Ta opcja /Qjest niezbędna, aby cicho usunąć wiele plików bez pytania użytkownika, czy wiele plików powinno zostać naprawdę usuniętych.
  • >nuljest konieczne, aby przekierować dane wyjściowe nazw plików zapisanych do obsługi STDOUT na urządzenie NUL, którego nie można usunąć, ponieważ plik jest aktualnie otwarty lub użytkownik nie ma uprawnień do usunięcia pliku.
  • 2>nuljest konieczne, aby przekierować wyjście komunikatu o błędzie dla każdego pliku, którego nie można usunąć z uchwytu STDERR do urządzenia NUL .

Polecenia FOR i RD służą do usuwania wszystkich podkatalogów z określonego katalogu. Ale for /Dnie jest używany, ponieważ FOR ignoruje w tym przypadku podkatalogi z ustawionym ukrytym atrybutem. Z tego powodu for /Fsłuży do uruchomienia następującego wiersza poleceń w osobnym procesie poleceń uruchomionym w tle za pomocą %ComSpec% /c:

dir "%PathToFolder%\*" /AD /B 2>nul

Dane wyjściowe DIR są w formacie nagim ze względu /Bna pozycje katalogu z atrybutem D, tj. Nazwy wszystkich podkatalogów w określonym katalogu, niezależne od innych atrybutów, takich jak atrybut ukryty bez ścieżki. 2>nulsłuży do przekierowania wyjścia komunikatu o błędzie przez DIR w żadnym katalogu nie znalezionym z uchwytu STDERR do urządzenia NUL .

Operator przekierowania >musi być poprzedzony znakiem karetki ^, w wierszu polecenia FOR, aby interpretować go jako znak dosłowny, gdy interpreter poleceń systemu Windows przetwarza ten wiersz polecenia przed wykonaniem polecenia FOR, które wykonuje osadzony dirwiersz polecenia w oddzielnym procesie poleceń w tle.

FOR przetwarza wychwycone dane wyjściowe napisane w celu obsługi STDOUT uruchomionego procesu komend, które są nazwami podkatalogów bez ścieżki i nigdy nie są ujęte w podwójny cudzysłów.

FOR z opcją /Fignoruje puste linie, które nie występują tutaj, ponieważ DIR z opcją /Bnie wyświetla pustych linii.

FOR zignoruje również linie zaczynające się od średnika, który jest domyślnym znakiem końca linii. Nazwa katalogu może zaczynać się średnikiem. Z tego powodu eol=|służy do zdefiniowania znaku pionowego paska jako znaku końca wiersza, którego żaden katalog ani plik nie może mieć w nazwie.

FOR podzieli linię na podciągi, używając spacji i tabulacji poziomej jako ograniczników, i przypisze tylko pierwszy ciąg rozdzielany spacją / tabulacją do określonej zmiennej pętli I. To zachowanie podziału nie jest tutaj potrzebne, ponieważ nazwa katalogu może zawierać jedną lub więcej spacji. Dlatego delims=służy do zdefiniowania pustej listy ograniczników, aby wyłączyć zachowanie podziału linii i przypisać się do zmiennej pętli I, zawsze pełnej nazwy katalogu.

Polecenie FOR uruchamia polecenie RD dla każdej nazwy katalogu bez ścieżki, co jest przyczyną, dla której w wierszu polecenia RD należy ponownie podać ścieżkę folderu, która jest połączona z nazwą podfolderu.

Aby zrozumieć używane polecenia i sposób ich działania, otwórz okno wiersza polecenia, wykonaj tam następujące polecenia i bardzo dokładnie przeczytaj wszystkie strony pomocy wyświetlane dla każdego polecenia.

  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rd /?
  • rem /?
  • set /?
  • setlocal /?
Mofi
źródło
5

Za pomocą Notatnika utwórz dokument tekstowy i skopiuj / wklej to:

rmdir /s/q "%temp%"
mkdir "%temp%"

Wybierz Zapisz jako i nazwę pliku:

delete_temp.bat

Zapisz jako typ: Wszystkie pliki i kliknij Saveprzycisk.

Działa na każdym koncie (administrator lub zwykły użytkownik). Po prostu uruchom to!

W tym przykładzie używam zmiennej tymczasowej, ale możesz użyć dowolnej innej! PS: Tylko dla systemu operacyjnego Windows!

Filip Gjorgjevikj
źródło
dość łatwe i czyste rozwiązanie
Carlos Liu
4

Aby usunąć plik:

del PATH_TO_FILE

Aby usunąć folder ze wszystkimi plikami:

rmdir /s /q PATH_TO_FOLDER

Usunięcie wszystkich plików z określonego folderu (nie usuwanie samego folderu) jest nieco skomplikowane. del /s *.*nie można usunąć folderów, ale usuwa pliki ze wszystkich podfolderów. Potrzebne są więc dwa polecenia:

del /q PATH_TO_FOLDER\*.*
for /d %i in (PATH_TO_FOLDER\*.*) do @rmdir /s /q "%i"
Maxim Susłow
źródło
Tak, to jest poprawne. Muszą być dwa kroki. To zasługuje na więcej głosów pozytywnych, ponieważ wyjaśnia, dlaczego, w porównaniu z bardziej głosowaną odpowiedzią powyżej.
WesternGun
W wierszu polecenia DEL brakuje opcji /Ausuwania również plików z ukrytym zestawem atrybutów oraz opcji /Fusuwania również plików z zestawem atrybutu tylko do odczytu i podwójnymi cudzysłowami wokół ostatniego argumentu. Tak del /A /F /Q "PATH_TO_FOLDER\*"byłoby lepiej. A wiersz poleceń FOR powinien zostać zmodyfikowany, for /F "eol=| delims=" %%I in ('dir "PATH_TO_FOLDER\*" /AD /B 2^>nul') do rd /Q /S "PATH_TO_FOLDER\%%I"ponieważ FOR ignoruje katalogi z ukrytym zestawem atrybutów. DIR z opcjami /AD /Bwyświetla wszystkie katalogi PATH_TO_FOLDERzawierające tylko ich nazwy.
Mofi
Czym różni się to od (niektórych) poprzednich odpowiedzi?
Peter Mortensen
4

Możesz to zrobić za pomocą następującego polecenia, aby usunąć całą zawartość i sam folder nadrzędny:

RMDIR [/S] [/Q] [drive:]path            
Ripon Al Wasim
źródło
Czym różni się to od dwóch poprzednich odpowiedzi?
Peter Mortensen
Czy ta odpowiedź spełnia wymóg „może występować błąd, taki jak„ ten plik / folder jest już w użyciu ”... kiedy to nastąpi, należy po prostu kontynuować i pominąć ten plik / folder.” ?
Peter Mortensen
1

Wypróbowałem kilka z tych podejść, ale żadne nie działało poprawnie.

Znalazłem to dwuetapowe podejście w witrynie Windows Command Line :

forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==FALSE del @file"

forfiles /P %pathtofolder%  /M * /C "cmd /c if @isdir==TRUE rmdir /S /Q @file"

Działało dokładnie tak, jak potrzebowałem i jak określono w OP.

Paul Haan
źródło
Dwa wiersze poleceń można połączyć w jeden wiersz poleceń: dodano opcję forfiles /P "%pathtofolder%" /M * /C "%SystemRoot%\System32\cmd.exe /C if @isdir==FALSE (del /A /F @file) else rd /Q /S @file" DEL,/A aby usunąć również pliki z ustawionym atrybutem ukrytym, ponieważ w przeciwnym razie DEL wyświetli komunikat o błędzie nie znaleziony dla każdego ukrytego pliku w %pathtofolder%. Dodano opcję DEL,/F aby usunąć również pliki z ustawionym atrybutem tylko do odczytu, %pathtofolder%ponieważ w przeciwnym razie DEL wyświetli komunikat o błędzie odmowy dostępu.
Mofi
To rozwiązanie jest najwolniejsze ze wszystkich niekompletnych rozwiązań opublikowanych tutaj, ponieważ uruchomiono cmd.exeinstancję dla każdego pliku i każdego katalogu w %pathtofolder%. Zaletą jest to, że FORFILES nie ignoruje katalogów z ukrytym atrybutem ustawionym tak jak FOR .
Mofi,
Re „Działało dokładnie tak, jak potrzebowałem i jak określono w OP”. : Czy sprawdziłeś, czy istnieje wymóg „może występować błąd, taki jak„ ten plik / folder jest już w użyciu ”... kiedy to nastąpi, należy po prostu kontynuować i pominąć ten plik / folder.” ?
Peter Mortensen
0
@ECHO OFF
rem next line removes all files in temp folder
DEL /A /F /Q /S "%temp%\*.*"
rem next line cleans up the folder's content
FOR /D %%p IN ("%temp%\*.*") DO RD "%%p" /S /Q
Robie
źródło
Drugi wiersz usunie pliki w każdym pliku ze wszystkich folderów w katalogu tymczasowym systemu Windows, a trzeci wiersz wyczyści katalogi wraz z zawartością.
Robie
Linia poleceń FOR powinna zostać zmieniona na, for /F "eol=| delims=" %%I in ('dir "%TEMP%\*" /AD /B 2^>nul') do rd /Q /S "%TEMP%\%%I"ponieważ FOR ignoruje katalogi z ukrytym zestawem atrybutów. DIR z opcjami /AD /Bwyświetla wszystkie katalogi %TEMP%zawierające tylko ich nazwy.
Mofi
Dokumentacja dla DEL . Myślę, że jesteś na dobrej drodze z / F: „Zignoruj ​​ustawienie tylko do odczytu i usuń mimo to (FORCE)”
Peter Mortensen
-10

Posługiwać się:

del %pathtofolder%\*.*   /s /f  /q

Spowoduje to usunięcie wszystkich plików i podfolderów, w %pathtofolder%tym plików tylko do odczytu, i nie monituje o potwierdzenie.

Alon
źródło
9
Niech mnie to pozostawia puste podfoldery w% pathtofolder%.
DH
35
NIE usuwa podfolderów w% pathtofolder%. Tak źle, że nie mam reputacji, by głosować za tą fałszywą odpowiedzią
Witalij Korsakow
1
Jak zauważył Vitalii Korsakov, powoduje to usunięcie wszystkich plików i plików z podkatalogów, ale pozostawia podkatalogi na miejscu, o które OP poprosił również o usunięcie.
Fuzz Evans
6
Mimo że to polecenie pozostawia puste foldery, jest znacznie bliżej żądanej odpowiedzi niż zaakceptowana odpowiedź. Oczywiście zależy to od okoliczności. W moim przypadku wolałbym mieć puste foldery niż pliki pozostawione w katalogu głównym.
MarcusUA,
ale w jaki sposób możemy usunąć foldery i podfoldery, które były otwarte w udziale sieciowym, gdy inny komputer kliencki otwiera dysk udostępniania mający dostęp do zapisu do tego folderu. polecenie psfile i net files zamknie sesję plików, ale po kilku sekundach utworzy automatycznie kolejna sesja dla tego użytkownika na serwerze ...
user1954762