2013-12-18 6 views
0

Я хотел бы создать пакетный скрипт в Windows, чтобы удалить все файлы из папки, за исключением 5 конкретных файлов. Например, я хотел бы удалить все * .txt файлы, кроме файлов file1.txt, file2.txt, file3.txt, file4.txt и file5.txt.Как удалить все файлы в папке, кроме 5 файлов

+0

Я бы переименовать эти 5 файлов (в другое расширение), удалите * .txt, а затем переименуйте их обратно. –

+0

@joshpoley Это может работать в другой ситуации, но он хочет удалить все файлы. – foxidrive

+0

На самом деле, теперь я вижу, что OP говорит, что он хочет удалить оба файла, а затем просто * .txt – foxidrive

ответ

2

Я попробовал следующую команду, и она работает. Test1.txt и test2.txt - это файл im, исключающий удаление. То, что он делает, это определить файл исключения в/и цикл через txt-файлы внутри папки. Это делается для обеспечения того, чтобы оно предназначалось только для файлов .txt.

@echo off 
setlocal EnableDelayedExpansion 
rem Add more names separated with slashes here: 
set exclude=/test1.txt/test2.txt/ 
for %%a in (*.txt) do (
    if "!exclude:/%%~a/=!" equ "%exclude%" (
     echo "Deleting" %%~a 
     del "%%~a" 
    ) 
) 

Коды адаптированы для этой темы - How do I exclude specific file names from an MS DOS dir list?. Я немного изменил, чтобы отобразить расширение файла (требуется для команды delete) и действие delete.

+1

Этот фрагмент кода работает отлично! именно то, что мне нужно! – user2885241

-1
for %%f in (*.txt) do (
    if not %%f == file1.txt if not %%f == file2.txt if not %%f == file3.txt if not %%f == file4.txt if not %%f == file5.txt del %%f 
) 

Если вам не нравится смехотворно длинные командные строки, сделать

for %%f in (*.txt) do (
     if not %%f == file1.txt (
       if not %%f == file2.txt (
         if not %%f == file3.txt (
           if not %%f == file4.txt (
             if not %%f == file5.txt (
               del %%f 
     ))))) 
) 
+0

Почему кто-то сделал это? Он не удаляет все файлы и не обрабатывает длинные имена файлов, но должен отлично работать с указанными именами файлов. Может быть, в нижнем коде есть слишком много ')' символов, но почему downvote и не дают обратной связи? – foxidrive

+0

Эта команда не рекомендуется даже дольше, и есть более элегантная логика для имитации партии команд OR. См. Мой ответ, чтобы лучше понять его. Я использую метод для реализации логического ИЛИ в пакетном режиме, используя переменную «DEL_FILE_FLAG». – D3F4ULT

+0

@ D3F4ULT: Да, ваш метод реализации/моделирования OR с помощью флага является элегантным и, очевидно, расширяется до большего количества исключенных файлов. Но что вы подразумеваете под «Эта команда не рекомендуется даже дольше»? – Scott

2

Это будет работать - не запускать его в любой папке, кроме того, вы собираетесь:

@echo off 
for %%a in (1 2 3 4 5) do attrib +h "file%%a.txt" 
del *.*? 
for %%a in (1 2 3 4 5) do attrib -h "file%%a.txt" 
+0

Интересный подход. Почему вы используете '*. *?' Вместо '*. *'? – Scott

+0

@scott Он останавливает del, спрашивая, действительно ли вы хотите удалить все файлы. В современных версиях DEL есть переключатель, чтобы сделать то же самое. – foxidrive

+0

Но '*. *?' Не будет соответствовать файлам без расширения, не так ли? – Joey

3
for /f "delims=" %%a in ('dir /a-d /b ^|findstr /xirv "file[1-5]\.txt"') do del "%%~a" 
+0

+1 Это умный ... – Aacini

+0

Но вопрос сказал: «Например, ... кроме file1.txt, file2.txt, file3.txt, file4.txt и file5.txt». Эти имена могут быть только примером ; настоящие имена могут быть «mercury.txt», «venus.txt», «earth.txt», «mars.txt» и т. д., и этот ответ нелегко адаптируется к более реалистичному (мирскому!) сценарию. С другой стороны, это решение тривиально модифицировано для включения скрытых файлов. – Scott

+1

@Scott мой код является лишь примером для синтаксиса Regex в Windows Scripting Language. Если хотите, поместите выражения 'pluto.url' и' blue.navi' в выражение. Я не могу написать сценарий, решая все проблемы с сценариями в мире:/ – Endoro

1
md _emptyDir_ & robocopy _emptyDir_ . /purge /xf file1.txt file2.txt file3.txt file4.txt file5.txt 

Это создаст новый каталог (_emptyDir_) без файлов в нем , Затем robocopy используется для очистки текущего каталога файлов, отсутствующих в _emptyDir_. Поскольку в каталоге нет файлов, все файлы удаляются, за исключением файлов, указанных для исключения. Aditionaly, нет необходимости в rmdir _emptyDir_, поскольку robocopy также обработает его.

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

md _emptyDir_ & robocopy _emptyDir_ . *.txt /purge /xf file1.txt file2.txt file3.txt file4.txt file5.txt 

Из пустого каталога в текущий каталог, процесс только * .txt файлов, удаление не все существующий в источнике (есть что-нибудь на нем), кроме исключенных файлов.

В этом случае, поскольку обрабатываются только файлы txt, _emptyDir_ не удаляется автоматически.

2

Удалить все * .txt файлы в папке ScanDir за исключением, file1.txt, file2.txt, file3.txt, file4.txt, file5.txt

@echo off 
@break off 
@title How to delete all files in a folder except 5 files - D3F4ULT 
@color 0a 
@cls 

setlocal EnableDelayedExpansion 

set "SCANDIR=D:\Batch\Stack Overflow\How to delete all files in a folder except 5 files\files" 

if not exist "!SCANDIR!\" echo ERROR&&echo.&&echo Folder not found = '%~nx1'&&echo.&&echo Exiting...&&echo.&&ping -n 8 localhost>nul&&exit /B 1 

for %%a in ("!SCANDIR!\*.txt") do (
    set "DEL_FILE_FLAG=Y" 
    if /I "%%~nxa" EQU "file1.txt" set "DEL_FILE_FLAG=N" 
    if /I "%%~nxa" EQU "file2.txt" set "DEL_FILE_FLAG=N" 
    if /I "%%~nxa" EQU "file3.txt" set "DEL_FILE_FLAG=N" 
    if /I "%%~nxa" EQU "file4.txt" set "DEL_FILE_FLAG=N" 
    if /I "%%~nxa" EQU "file5.txt" set "DEL_FILE_FLAG=N" 
    if defined DEL_FILE_FLAG if "!DEL_FILE_FLAG!" EQU "Y" (
    del /f /q "%%~dpnxa">nul 2>&1 
) 
) 

pause 
exit 
Смежные вопросы