Как я могу удалить все файлы / подкаталоги, кроме некоторых файлов в DOS? - PullRequest
11 голосов
/ 17 февраля 2009

Я ищу сценарий DOS для удаления всех файлов и подкаталогов в корневом каталоге, кроме набора пакетных файлов (* .bat), которые находятся в корневом каталоге. Любые DOS-шутники, которые знают, как это легко сделать?

Обновление

Спасибо всем за помощь. Это где я сейчас (см. Ниже). Я использую предложение Кена для удаления файлов. Я хотел бы знать, как я могу остановить выполнение этого скрипта, если команды del или RD не работают из-за блокировки файла / dir. Кто-нибудь знает как? Прямо сейчас, этот сценарий будет делать кучу вещей после удаления, и я хотел бы остановить сценарий, если какое-либо из удалений завершится неудачей.

@echo off

REM *********************************************************************
REM *  Delete all files and subdirs except for batch files in the root  *
REM *********************************************************************

REM Delete all files in current dir except bat files.  Does this by a) setting the attributes of *.bat files to 
REM readonly and hidden, b) deleting the rest, c) reseting the attributes 

attrib +r +s *.bat
del *.* /S /Q
attrib -r -s *.bat

REM Deletes ALL subdirectories 

FOR /D  %%G in (*) DO RD /s /q %%G

Ответы [ 3 ]

21 голосов
/ 17 февраля 2009

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

attrib +r +s *.bat
del *.*
attrib -r -s *.bat

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

@echo off
@ if "%1" == "%9" goto help
@ if /i %1 EQU ? goto help
@ if /i %1 EQU help goto help
@ attrib +h +s %1
@ %2 %3 /Q
@ attrib -h -s %1
@ goto :EOF
:help
@echo        ╔═══════════════════════════════════════════════════════╗
@echo        ║ except filespec1 doscommand filespec2                 ║
@echo        ║                                                       ║
@echo        ║  filespec1  The files to exclude from doscommand      ║
@echo        ║  doscommmand The DOS command to execute on filespec2  ║
@echo        ║  filespec2  The files to execute doscommand against   ║
@echo        ║                                                       ║
@echo        ║ Example:                                              ║
@echo        ║                                                       ║
@echo        ║ except *.txt del *.*                                  ║
@echo        ║                                                       ║
@echo        ║Deletes all files except text files in the directory   ║
@echo        ╚═══════════════════════════════════════════════════════╝

Вероятно, можно использовать только скрытый атрибут, но я знаю, что del не касается скрытых системных файлов, поэтому я установил оба. Лучше, чем потом сожалеть, ИМО.

На основании комментария Маркуса: если вы хотите расширить это, чтобы включить подкаталоги текущего каталога, просто измените обе строки атрибута на

attrib <remainder of line>  /S

и измените строку между двумя строками атрибута на

@ %2 %3 /Q /S

Это должно работать для большинства вещей, которые вы хотели бы, кроме .bat, чтобы сделать.

2 голосов
/ 17 февраля 2009

Исправлено на основе комментария @ Кена:

>d:
>mkdir bats
>c:
>copy *.bat d:\bats
>del *.* / Y
>copy d:\bats\*.bat c:\
0 голосов
/ 18 февраля 2009

Это основано на методе Алекса резервного копирования файлов .BAT, но также удаляет все подпапки, используя команду RD.

@echo off

rem !WARNING!
rem THE_DELETE_DRIVE is the drive to delete
rem THE_BACKUP_DRIVE is the drive to use for backup
set THE_DELETE_DRIVE=T:
set THE_BACKUP_DRIVE=C:
rem !WARNING!

echo This will recursively delete everything from %THE_DELETE_DRIVE%\ (except batch files).
echo Are you sure? Press Ctrl+C to cancel, or any other key to continue...
echo.
pause

rem Make the backup folder
md %THE_BACKUP_DRIVE%\bak12345

rem Copy all batch files from delete-drive root to backup folder
copy %THE_DELETE_DRIVE%\*.bat %THE_BACKUP_DRIVE%\bak12345

rem Delete everything in the delete-drive root
rd /s/q %THE_DELETE_DRIVE%\

rem Copy all backed-up files back to delete-drive root
copy %THE_BACKUP_DRIVE%\bak12345\*.bat %THE_DELETE_DRIVE%\

rem Remove the backup folder
rd /s/q %THE_BACKUP_DRIVE%\bak12345

echo ************************************
echo All Done!
echo ************************************
echo.

pause
...