Удалить все файлы из папки и ее подпапок

52

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

Это может быть достигнуто в пакетном или VBScript сценариях?

Я пробовал очень простую пакетную команду, но для этого требовалось, чтобы пользователь разрешил удаление каждого файла. Это не подходящее решение, так как существует много сотен файлов, и со временем оно значительно увеличится.

Что вы можете предложить?

BobJim
источник
Вы имеете в виду рекурсивное удаление? Это действительно может быть сделано. Нечто подобное rd /s /q "c:\folder aвыполнит рекурсивное удаление всех файлов и папок внутриFolder A
Ramhound
Я мог бы сделать, я не знаю, как писать сценарии в powershell, но у меня были сценарии powershell для предыдущего запуска.
BobJim
2
Сейчас самое подходящее время для изучения, я бы исследовал синтаксис batch и 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

MDMoore313
источник
1
Это -Include *.*не -Include .большая разница! :-)
MDMoore313
Get-ChildItem -Path D: \ EmptyThisFolder -Include . -File -Recurse | 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Переключатель , чтобы удалить только файлы рекурсивно.

phoops
источник
2
Это только удалит файлы, но оставит папки?
BobJim
5
Да. Вы можете добавить /Pопцию, чтобы она попросила вас подтвердить каждое удаление, чтобы проверить это.
фотки
спасибо плохо попробуй! надеюсь, сэкономит массу времени!
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"
Travis
источник
Спасибо за идею, но в настоящее время я думаю, что процесс «опорожнения» будет завершен в очень незапланированные временные рамки. Я оставлю этот код на будущее! Приветствия
BobJim
Заголовок гласит «Удалить все файлы из папки и ее подпапок», так что это не решение.
Андерс
4

Использование PowerShell:

Get-ChildItem -Path c:\temp -Include * | remove-Item -recurse 
Григорий Сувалиан
источник
3

Используйте PowerShell для удаления отдельного файла или папки. Перед выполнением команды Delete в powershell мы должны убедиться, что вы вошли на сервер или ПК с учетной записью, которая имеет полный доступ к объектам, которые вы хотите удалить.

Пример: http://dotnet-helpers.com/powershell-demo/how-to-delete-a-folder-or-file-using-powershell/

Использование PowerShell Comnads для удаления файла

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

Приведенная выше команда выполнит и удалит файл «DummyfiletoDelete.txt», который находится внутри папки «C: \ dotnet-helpers».

Использование PowerShell Comnads для удаления всех файлов

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

Использование PowerShell Comnads для удаления всех файлов и папок

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

-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}
Boubakr
источник
1
  1. В проводнике Windows выберите корневой каталог, содержащий все файлы и папки.

  2. Искать *

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

  4. Выберите все файлы и нажмите Удалить.

Это удалит все файлы и сохранит структуру каталогов.

Эмель
источник
1

Удалите все файлы из текущего каталога и подкаталогов, но оставив структуру папок.

( /Q) переключатель для запроса пользователя, если он в порядке, чтобы удалить

Внимание : попробуйте без, /Qчтобы убедиться, что вы не удаляете ничего ценного.

del /S * /Q 
hdoghmen
источник
1

Это самый простой способ ИМО

Откройте PowerShell, перейдите в каталог ( cd), ТО

ls -Recurse * | rm

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

Если вы хотите удалить на основе определенного расширения

ls -Recurse *.docx | rm

ls перечисляет каталог

-Recurse это флаг, говорящий PowerShell, чтобы войти в любые подкаталоги

* говорит все

*.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".
bertieb
источник
-1

В дополнение к приведенным выше ответам, на самом деле нет необходимости использовать Get-Childitem и передавать результат в конвейер в приведенных выше ответах, поскольку ключевое слово -Include включено в команду Remove-Item.

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

Remove-Item -Include " . " "C: \ Temp" -Recurse

Sams0nT
источник