PDA

Показать полную графическую версию : [решено] Очистка папки обмена с сохранением подкаталогов


ru52
22-03-2011, 16:34
Есть папка обмена
C:\TMP
Содержащая несколько папок отделов с установленными соответствующими разрешениями.
C:\TMP\A
C:\TMP\B
C:\TMP\C
Требуется очищать все файлы в папке C:\TMP и во всех ее подкаталогах, при этом сохраняя сами папки отделов.

Не получается добавить в скрипт исключения удаления самих каталогов.
Подбросьте, пожалуйста, скрипт. Может сталкивался кто с такой задачей.
Спасибо!

megaloman
22-03-2011, 19:17
Del C:\Tmp\*.* /A:R /A /S /Q

UpDaTe
22-03-2011, 19:44
Если на VBS, то можно как-то так:


Option Explicit
dim FolderPatch, objFSO, objFolder
dim oneFolder
dim onefile
dim objfile, fileList

FolderPatch="C:\TMP"
set objFSO=CreateObject("Scripting.FileSystemObject")
set objFolder=objFSO.GetFolder(FolderPatch)

Sub GetAllFolders(objFolder)
for each oneFolder in objFolder.SubFolders
set fileList=onefolder.Files
for each onefile in fileList
objFile=onefile.delete
next
GetAllFolders oneFolder 'используем рекурсию
next
end sub

set fileList=objFolder.Files
for each onefile in fileList
objFile=onefile.delete
next
GetAllFolders(objFolder)

megaloman
22-03-2011, 21:58
Виноват, не посмотрел тему сообщения, но всё же батник существенно короче.
UpDaTe, Похоже на Ваше решение, но чуть короче за счет применения метода DeleteFile и групповых символов в имени файла Public FSO

AllDir = "P:\TMP" ' --------- Полное имя рабочего каталога (без слэжа \ на конце)
Set FSO = CreateObject("Scripting.FileSystemObject")
AllFolders AllDir

' ---------------------------------------------------------------------------
Sub AllFolders(WDir)
FSO.DeleteFile WDir + "\*.*", True

Set SubF = FSO.GetFolder(WDir).SubFolders

For Each Folder In SubF
AllFolders WDir + "\" + Folder.Name
Next
End Sub

ru52
23-03-2011, 09:04
Все эти варианты работают и удаляют все файлы в подкаталогах, но оставляют за собой пустые папки.
То есть проблема в том, что не нужно оставлять ничего кроме самих папок A,B,C.

Busla
23-03-2011, 09:18
а поискать по форуму?
CMD/BAT - [решено] программирование bat на удаление файлов из папки (http://forum.oszone.net/thread-200091.html)

Iska
23-03-2011, 09:29
ru52, примерно так:
@echo off
setlocal enableextensions enabledelayedexpansion

set sFolder=C:\TMP

echo Clearing [%sFolder%]...
del /f /q "%sFolder%"

for /d %%i in ("%sFolder%\*.*") do (
echo Clearing [%%i]...
pushd "%%i" && (rmdir /s /q "%%i" & popd) 2>nul
)

endlocal
exit /b 0

megaloman
23-03-2011, 16:07
Если надо в папке сохранить подпапки в её корне, и удалить все файлы и папки в них, в моём решении замените подпрограмму на вот эту
Sub AllFolders(WDir)
FSO.DeleteFile WDir + "\*.*", True

Set SubF = FSO.GetFolder(WDir).SubFolders

For Each Folder In SubF
FSO.DeleteFile WDir + "\" + Folder.Name + "\*.*", True
FSO.DeleteFolder WDir + "\" + Folder.Name + "\*.*", True
Next

End Sub
Но батник всё равно короче и надёжнее:@Echo Off
Set Where=C:\Tmp

FOR /F "usebackq delims=" %%i IN (`Dir %Where%\*.* /B /A:D`) DO Call :CleanDir "%%i"
Del "%Where%\*.*" /S /A:R /A /Q >nul 1>nul
GoTo :Eof

:CleanDir
Cd /D "%Where%\%~1"
rd "%Where%\%~1" /S /Q

ru52
23-03-2011, 17:40
Спасибо огромное, работает!

megaloman
17-01-2015, 10:41
...мне нужно содержание одной папки в корневом каталоге оставлять нетронутым. Подскажите, пожалуйста, как это сделать?
@Echo Off

Set "Where=C:\Tmp"
Set "NoErase=Не чистим"

FOR /F "usebackq delims=" %%i IN (`Dir %Where%\*.* /B /A:D`) DO Call :CleanDir "%%i"

Del "%Where%\*.*" /A:R /A /Q >nul 1>nul 2>nul
GoTo :Eof

:CleanDir

IF /I NOT %1=="%NoErase%" (
Cd /D "%Where%\%~1"
rd "%Where%\%~1" /S /Q 1>nul 2>nul
)
Если в имени подпапки, которую не чистим, русские буквы, батник должен быть в 866 кодировке




© OSzone.net 2001-2012