Видаліть усі файли з папки та її підпапок


52

Я хочу видалити всі файли зі структури папок, тому мені залишається порожня структура папки.

Це може бути досягнуто або в пакетному, або в VBScript сценарії?

Я спробував дуже базову командну пакетну команду, але це вимагало від користувача дозволити видалення кожного файлу. Це не було підходящим рішенням, оскільки існує багато сотень файлів, і це з часом значно зросте.

Що ви можете запропонувати?


Ви маєте на увазі рекурсивне видалення? Це дійсно можна зробити. Щось подібне rd /s /q "c:\folder aвиконає рекурсивне видалення всіх файлів і папок всерединіFolder A
Ramhound

Я міг би це зробити, я не знаю, як скриптувати в powerhell, але я мав попередні сценарії запуску повноважень.
BobJim

2
Зараз ідеальний час для навчання, я б досліджував синтаксис партії та vbs для застарілих цілей, але вкладаю більше часу в навчання PS.
MDMoore313

У мене ще не було можливості перевірити код, хоча я впевнений, що він спрацює. Я повернусь і виберу найбільш відповідну відповідь на свій початковий запит.
BobJim

Я буду другою рекомендацією @ BigHomie - я просто навчився PowerShell, і я повинен сказати, що це дуже акуратно - не надто важко, добре зброю в арсеналі будь-якого кодера. Зараз я користуюся досить часто.
Бен

Відповіді:


75

Це можна досягти за допомогою PowerShell :

Get-ChildItem -Path C:\Temp -Include *.* -File -Recurse | foreach { $_.Delete()}

Ця команда отримує кожен дочірній елемент $path, виконує метод видалення на кожному, і це досить швидко. Структура папки залишається недоторканою.

Якщо у вас можуть бути файли без розширення, використовуйте

Get-ChildItem -Path C:\Temp -Include * -File -Recurse | foreach { $_.Delete()}

замість цього.

Здається, -Fileпараметр, можливо, було додано після PowerShell v2. Якщо це так, то

Get-ChildItem -Path C:\Temp -Include *.* -Recurse | foreach { $_.Delete()}

Слід зробити фокус для файлів, які мають розширення.

Якщо це не працює, перевірте, чи є у вас оновлена ​​версія Powershell


1
Це -Include *.*не так -Include ., велика різниця! :-)
MDMoore313

Get-ChildItem-Шлях D: \ EmptyThisFolder -Включити . -Файл -рекурс | foreach {$ _. Delete ()}
BobJim

Для чого ви використовуєте -Include .?? Ось у чому проблема.
MDMoore313

2
Вони не можуть реалізувати powershell --version? Чи не можуть вони використовувати номер версії з позитивними цифрами? Це просто божевільно. Більше 1300 заявок на запитання про те, як дізнатися номер версії програми?
Томас Веллер

1
@demonicdaron його не передбачається; Питання ОП полягало у збереженні структури папок.
MDMoore313

25

Короткий і просторий PowerShell. Не впевнений, з якою найнижчою версією PS він буде працювати.

Remove-Item c:\Tmp\* -Recurse -Force

2
Приємно і легко. Це зробило трюк, поки прийнята відповідь не зробила!
demonicdaron

Це має бути прийнята відповідь, ви навіть можете просто набрати, rm *оскільки це не дуже доцільно змушувати (у діалоговому вікні підтвердження в будь-якому випадку є варіант "Так для всіх").
Дж. Гарсія

22

Це можна зробити за допомогою delкоманди:

dir C:\folder
del /S *

/SПеремикач , щоб видалити тільки файли рекурсивно.


2
Це буде лише видаляти файли, але залишати папки?
BobJim

5
Так. Ви можете додати /Pваріант, щоб він попросив підтвердити кожне видалення лише для того, щоб перевірити це.
phoops

дякую погано дай це піти! сподіваємось, заощадите багато часу!
BobJim

3
Так. А для видалення прихованих та системних файлів виконайте attrib -s -r -h Folder\*.* /s /dперед видаленням. А для дозволів використовуйте takeownкоманду.
Jet

2
І ви можете використовувати / Q, щоб НЕ просити підтвердження під час використання символів.
Айлатан

4

Читаючи між рядками вашого оригінального запитання, я можу запропонувати альтернативний рядок коду BATCH, який ви можете використовувати. Це буде робити при запуску лише видалити файли, яким більше 60 днів. Таким чином ви можете помістити це в заплановане завдання, і коли він буде запущений, він видаляє зайві файли, які вам не потрібні, а не видування всього каталогу. Ви можете змінити 60 - 5 днів або навіть 1 день, якщо хочете. Це не видаляє папки.

forfiles -p "c:\path\to\files" -d -60 -c "cmd /c del /f /q @path"

Дякую за ідею, але на даний момент я думаю, що процес "випорожнення" буде завершений на дуже позапланові часові рамки. Я збережу цей код на майбутнє! Ура
BobJim

У заголовку написано "Видалити всі файли з папки та її підпапок", тому це не є рішенням.
Андерс Лінден


3

Використовуйте PowerShell для видалення одного файлу чи папки. Перш ніж виконати команду «Видалити» в командних повноваженнях, нам потрібно переконатися, що ви ввійшли на сервер або ПК з обліковим записом, який має повний доступ до об’єктів, які потрібно видалити.

З прикладом: http://dotnet-helpers.com/powershell-demo/how-to-delete-a-folder-or-file-using-powershell/

За допомогою PowerShell видаляється файл

Remove-Item -Path "C: \ dotnet-helpers \ DummyfiletoDelete.txt"

Вищевказана команда виконає та видалить файл "DummyfiletoDelete.txt", який присутній у місці "C: \ dotnet-helpers".

За допомогою PowerShell видаляється всі файли

Remove-Item -Path "C: \ dotnet-helpers *. *"

За допомогою PowerShell видаляється всі файли та папки

Remove-Item -Path "C: \ dotnet-helpers *. *" -Рекурс

-recurseрозгортається і знаходить набагато більше файлів. –recurseПараметр дозволить PowerShell видалити всі дочірні елементи , не питаючи дозволу. Крім того, параметр –force може бути доданий для видалення прихованих файлів або файлів лише для читання.

За допомогою команди -Force для насильного видалення файлів

За допомогою команди PowerShell видалити всі файли насильно

Remove-Item -Path "C: \ dotnet-helpers *. *" -Force


1

Спробуйте це за допомогою PowerShell. У цьому прикладі я хочу видалити всі файли .class:

Get-ChildItem '.\FOLDERNAME' -include *.class -recurse | foreach ($_) {remove-item $_.FullName}

1
  1. У Windows Explorer виберіть кореневий каталог, що містить усі файли та папки.

  2. Шукати *

  3. Сортувати за типом (усі папки будуть вгорі, а всі файли, перелічені під ними)

  4. Виберіть усі файли та натисніть Видалити.

Це видалить усі файли та збереже структуру каталогу.


1

Видаліть усі файли з поточного каталогу та підкаталогів, але залишаючи структуру папок.

( /Q) перемикач призначений для запитання користувача, чи добре він видаляти

Застереження : спробуйте це без того, /Qщоб переконатися, що ви не видаляєте нічого дорогоцінного.

del /S * /Q 

1

Це найпростіший спосіб ІМО

Відкрийте PowerShell, перейдіть до каталогу ( cd), ТО

ls -Recurse * | rm

(Пуф) все пропало ...

Якщо ви хочете видалити на основі певного розширення

ls -Recurse *.docx | rm

ls перераховує каталог

-Recurse це прапор, що повідомляє повноваження перейти в будь-які підкаталоги

* говорить усе

*.doc все з розширенням .doc

| подати вихід зліва направо

rm видалити

Усі інші відповіді, мабуть, роблять це більш заплутаним, ніж необхідним.


0
dir C:\testx\ -Recurse -File | rd -WhatIf
What if: Performing the operation "Remove File" on target "C:\testx\x.txt".
What if: Performing the operation "Remove File" on target "C:\testx\bla\x.txt".

-1

Як доповнення до вищезазначених відповідей, насправді немає потреби використовувати Get-Childitem та передавати результат у конвеєр у вищезазначених відповідях, оскільки ключове слово -Include включено до команди Remove-Item

Можна просто:

Remove-Item -Include " . " "C: \ Temp" - повторити

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.