Как я могу удалить все файлы/субдиры, за исключением некоторых файлов в DOS?
Я ищу DOS script для удаления всех файлов и подкаталогов в корневом каталоге, за исключением набора пакетных файлов (*.bat), которые находятся в корневом каталоге. Какие-нибудь DOS-клубы, которые знают, как легко это сделать?
Обновление
Спасибо за вашу помощь всем. Вот где я сейчас (см. Ниже). Я использую предложение Ken для удаления файлов. Я хотел бы знать, как я могу остановить этот script, если команды del
или RD
выходят из строя из-за блокировки файла /dir. Кто-нибудь знает как? Прямо сейчас, этот script выполнит кучу вещей после удаления, и я хотел бы остановить script, если какое-либо из удалений завершится с ошибкой.
@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
Ответы
Ответ 1
Вы можете установить атрибуты файлов, которые хотите сохранить для чтения и скрыть сначала, удалить остальные, а затем reset атрибуты скрытых, readonly файлов обратно.
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 не касается скрытых системных файлов, поэтому я установил оба. Более безопасный, чем жалко, ИМО.
На основе комментария от Marcus: если вы хотите расширить его, чтобы включить подкаталоги текущего каталога, просто измените обе атрибутные строки на
attrib <remainder of line> /S
и измените линию между двумя атрибутными строками на
@ %2 %3 /Q /S
Это должно работать для большинства вещей, которые вы хотите использовать except.bat.
Ответ 2
Исправлено на основе комментария @Ken:
>d:
>mkdir bats
>c:
>copy *.bat d:\bats
>del *.* / Y
>copy d:\bats\*.bat c:\
Ответ 3
Это основано на методе Alex для резервного копирования файлов .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