Удалить *. * Исключая некоторые расширения - PullRequest
8 голосов
/ 24 февраля 2012

Я пытаюсь создать пакетный файл в Windows для удаления всех файлов в текущем каталоге, но исключая 4 расширения файла (log, sdb, sdk, bat).

Я попробовал команду Forfiles в Windowsно это удаляет все в моей текущей папке (даже файл bat).Моя команда:

@ECHO OFF
FORFILES /M *.* /C "cmd /c IF NOT @ext=="sdb" (IF NOT @ext=="sbk" (IF NOT @ext=="log" (IF NOT @ext=="bat" DEL @FILE)))" /Q

Как мне заставить это работать?

Большое спасибо!

Ответы [ 6 ]

9 голосов
/ 24 февраля 2012
  • внутренние кавычки должны быть экранированы с \
  • вы, вероятно, хотите IF /I (без учета регистра) параметр
  • вы должны использовать @ISDIR для исключения каталогов
  • Параметр DEL / Q был после последней цитаты, должен быть перед последней цитатой, но не нужен
  • скобки не нужны
  • Параметр FORFILES / M не требуется, поскольку ваша маска - «все файлы»

Это должно работать

@echo off
forfiles /c "cmd /c if @isdir equ FALSE if /i not @ext==\"sdb\" if /i not @ext==\"sbk\" if /i not @ext==\"log\" if /i not @ext==\"bat\" del @file"

Но вышеупомянутое очень медленно, и оно, безусловно, много печатать.

Следующее намного проще и быстрее.

@echo off
for /f "delims=" %%F in ('dir /b /a-d ^| findstr /vile ".sdb .sbk .log .bat"') do del "%%F"
6 голосов
/ 24 февраля 2012

Если вам доступно ROBOCOPY:

@ECHO OFF
MKDIR temporary_pit
ROBOCOPY . temporary_pit /XF *.sdb *.sbk *.log *.bat /MOV >NUL
RMDIR /S /Q temporary_pit

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

4 голосов
/ 24 февраля 2012

Также вы можете сделать что-то вроде этого:

@echo off
attrib -r -s *.*
attrib +r +s *.sdb
attrib +r +s *.sbk
attrib +r +s *.log
attrib +r +s *.bat
del *.* /S /Q
attrib -r -s *.sdb
attrib -r -s *.sbk
attrib -r -s *.log
attrib -r -s *.bat

- Марио

3 голосов
/ 24 февраля 2012
@echo off
setlocal EnableDelayedExpansion
set exclude=.log.sdb.sdk.bat.
for %%f in (*.*) do (
   if /I "%exclude%" == "!exclude:%%~Xf.=!" del "%%f"
)
1 голос
/ 23 марта 2016
forfiles /s /c "cmd /c (if NOT @ext==\"dqy\" del /s /q @path)" /D -14

Это примерно так просто, как я мог бы получить этот сценарий.Они хотели сохранить файлы макроса (.dqy), но рекурсивно удаляли все остальное старше 14 дней.

Запускается в текущем каталоге (будьте внимательны при тестировании).

0 голосов
/ 13 мая 2016

Я наткнулся на эту тему в поисках способа удаления сотен файлов, созданных вирусом. Ни одно из решений не сработало для меня, поэтому я понял, как это сделать из командной строки. Мне оставалось только сохранить 2 расширения (почтовый архив). Это сделало трюк:

for /R %f in (*) do if not %~xf==.ex1 if not %~xf==*.ex2 del "%f"

Я использую / R для рекурсивной работы: просмотрите все подпапки. % ~ Xf смотрит только на расширение (по какой-то причине оно не работает без него). Я использую кавычки "% f" в команде удаления, чтобы закрыть длинные имена окон пробелами (особенно в именах папок). Также по какой-то причине, добавление пробелов перед и бих = = привело к ошибкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...