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?
rm -rf path\to\folder
działa w systemie Windows 10 (lub może pochodzić z Git Bash ... tak czy inaczej, jeśli masz, warto spróbować!)Odpowiedzi:
Możesz użyć tego skryptu powłoki, aby wyczyścić folder i pliki w
C:\Temp
źródle :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
źródło
%p
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.To po cichu usuwa folder oraz wszystkie pliki i podfoldery.
źródło
md FOLDERNAME
(patrz odpowiedź z @rakoczyn poniżej).cd "FOLDERNAME"
RD . /S /Q
Najprostszym rozwiązaniem, jakie mogę wymyślić, jest usunięcie całego katalogu
Następnie ponownie utwórz ten katalog:
źródło
Spowoduje to usunięcie folderów i plików i pozostawienie folderu za sobą.
źródło
2>nul
wyświetla wynik „Proces nie może uzyskać dostępu do pliku, ponieważ jest używany przez inny proces”.RD /?
pokaże ci prosty sposób na opróżnienie folderu.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 tylkoset p="mypath"
na początku.... usuwa wszystkie pliki i foldery pod danym katalogiem, ale nie sam katalog.
źródło
/A
usuwania 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 /B
wyświetla wszystkie katalogi zawierające tylko ich nazwy. BTW:dir
nie jest dobrą nazwą dla zmiennej środowiskowej.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ęcRMDIR
nie uruchomi się, jeśliCD
polecenie się nie powiedzie (np. Błędnie wpisana nazwa katalogu):Z wiersza polecenia systemu Windows :
źródło
cd [Your_Folder]
to bardzo krytyczne - muszę o tym pamiętać, więc nie usuwam samego katalogu ...&&
między poleceniami zamiast podziału wiersza, aby zabezpieczyć się przed uszkodzeniem dysku CD.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:
źródło
/S
i co/Q
oznaczard
Jest równoważnermdir
i usunie sam katalog i nie jest tym, czego chce OP.Używam PowerShell
Spowoduje to usunięcie zawartości folderu, a nie samego folderu.
źródło
powershell -Command "Remove-Item 'PathToMyDirectory\*' -Recurse -Force"
Ż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:
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:
Ten komunikat o błędzie jest pomijany przez przekierowanie go
2>nul
do 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
/Q
i 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ą:
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.
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.
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 :
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>nul
uchwytu 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:\Temp
z nazwą udziałuTemp
i używając ścieżki UNC\\%COMPUTERNAME%\Temp\CleanTest
przypisanej do zmiennej środowiskowejPathToFolder
w 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 znaczyC:\Temp\CleanTest\Subfolder1
,Subfolder1
są usuwane przez RD , a obok POPD nie cicho w podejmowaniuC:\Temp\CleanTest\Subfolder1
ponownie bieżący katalog prowadząceZ:\CleanTest
pozostałą 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%
.Plik wsadowy najpierw upewnia się, że zmienna środowiskowa
PathToFolder
jest 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śćPathToFolder
jest łączona z innymi łańcuchami podczas wykonywania pliku wsadowego.Ważne są dwie linie:
Polecenie DEL służy do usunięcia wszystkich plików z określonego katalogu.
/A
jest 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
./F
jest konieczna, aby wymusić usunięcie plików z ustawionym atrybutem „tylko do odczytu”./Q
jest niezbędna, aby cicho usunąć wiele plików bez pytania użytkownika, czy wiele plików powinno zostać naprawdę usuniętych.>nul
jest 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>nul
jest 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 /D
nie jest używany, ponieważ FOR ignoruje w tym przypadku podkatalogi z ustawionym ukrytym atrybutem. Z tego powodufor /F
służy do uruchomienia następującego wiersza poleceń w osobnym procesie poleceń uruchomionym w tle za pomocą%ComSpec% /c
:Dane wyjściowe DIR są w formacie nagim ze względu
/B
na pozycje katalogu z atrybutemD
, tj. Nazwy wszystkich podkatalogów w określonym katalogu, niezależne od innych atrybutów, takich jak atrybut ukryty bez ścieżki.2>nul
sł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 osadzonydir
wiersz 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ą
/F
ignoruje puste linie, które nie występują tutaj, ponieważ DIR z opcją/B
nie 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. Dlategodelims=
służy do zdefiniowania pustej listy ograniczników, aby wyłączyć zachowanie podziału linii i przypisać się do zmiennej pętliI
, 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 /?
źródło
Za pomocą Notatnika utwórz dokument tekstowy i skopiuj / wklej to:
Wybierz Zapisz jako i nazwę pliku:
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!
źródło
Aby usunąć plik:
Aby usunąć folder ze wszystkimi plikami:
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:źródło
/A
usuwania również plików z ukrytym zestawem atrybutów oraz opcji/F
usuwania również plików z zestawem atrybutu tylko do odczytu i podwójnymi cudzysłowami wokół ostatniego argumentu. Takdel /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 /B
wyświetla wszystkie katalogiPATH_TO_FOLDER
zawierające tylko ich nazwy.Możesz to zrobić za pomocą następującego polecenia, aby usunąć całą zawartość i sam folder nadrzędny:
źródło
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 :
Działało dokładnie tak, jak potrzebowałem i jak określono w OP.
źródło
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.cmd.exe
instancję 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 .źródło
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 /B
wyświetla wszystkie katalogi%TEMP%
zawierające tylko ich nazwy.Posługiwać się:
Spowoduje to usunięcie wszystkich plików i podfolderów, w
%pathtofolder%
tym plików tylko do odczytu, i nie monituje o potwierdzenie.źródło