Войти

Показать полную графическую версию : Батник на удаление с исключением


djuwa4
11-04-2017, 19:18
Задача очень простая: удалять все файлы в корне диска D:\ и в корне его подпапки D:\Papka, за исключением файлов с расширением "Ярлык".

Вопрос! Как это сделать? PowerShell не возбраняю.

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

Вот пример моего батника:

chcp 1251
Del D:\*.pptx /q
Del D:\*.xls /q
Del D:\*.docx /q
Del D:\*.xlsx /q
Del D:\*.pdf /q
Del D:\*.png /q
Del D:\*.exe /q
Del D:\*.jpg /q
Del D:\*.doc /q
Del D:\Papka\*.pptx /q
Del D:\Papka\*.xls /q
Del D:\Papka\*.docx /q
Del D:\Papka\*.xlsx /q
Del D:\Papka\*.pdf /q
Del D:\Papka\*.png /q
Del D:\Papka\*.exe /q
Del D:\Papka\*.jpg /q
Del D:\Papka\*.doc /q

Iska
11-04-2017, 19:51
Ну, например:
@echo off
setlocal enableextensions enabledelayedexpansion

call :DelFilesInFolder "D:\"
call :DelFilesInFolder "D:\Papka"

endlocal
exit /b 0

:DelFilesInFolder
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=%~1

pushd "%sSourceFolder%" && (
for /f "usebackq delims=" %%i in (`2^>nul dir /a:-d /b "*.*"`) do if "%%~xi" neq ".lnk" echo del /f /q "%%~i"
popd
) || (
echo Can't find source folder [%sSourceFolder%].
exit /b 1
)

endlocal
exit /b 0

chcp 1251 »
Никаких chcp 1251. Просто сохраняйте пакетный файл в кодировке OEM/866.

djuwa4
12-04-2017, 09:10
Iska! Спасибо вам огромное!!!!

djuwa4
12-04-2017, 10:41
Думаю кому-то понадобится, скину ссылочки в которых описываются команды из батника:
setlocal (enableextensions, enabledelayedexpansion, endlocal) - http://ab57.ru/cmdlist/setlocal.html
call - http://ab57.ru/cmdlist/call.html
exit - http://ab57.ru/cmdlist/exit.html
Функция DelFilesInFolder - http://wm-help.net/lib/b/book/1239221356/168


Остальные буду дописывать в этом комментарии.

megaloman
12-04-2017, 15:44
Хоть задача и решена, позволю себе добавить свой вариант@Echo Off
cls

Set "Exclude="" ".vbs" ".bat""

Call :DelList "%Exclude%" "Z:\*.*"

Call :DelList ".lnk" "Z:\Temp\*.*"

pause
GoTo :Eof

:DelList
FOR %%i IN (%2) DO Call :DelExclude %1 "%%i"
GoTo :Eof

:DelExclude
For %%e in (%~1) Do If /I "%~x2"==%%e GoTo :Eof
Echo Del %2
GoTo :Eof
Для реальной работы уберите Echo перед Del

Iska
12-04-2017, 16:02
Функция DelFilesInFolder - http://wm-help.net/lib/b/book/1239221356/168 »
После этого полный путь к удаляемому файлу и значение переменной Status печатаются в окне Блокнота с помощью метода SendKeys
Вот будет радости-то при попытке задействовать этот «метод» с кириллическими путями/именами. Создай текстовый файл, пиши в него, затем тупо отдай на откуп системе его открытие по ShellExecute().




© OSzone.net 2001-2012