Показать полную графическую версию : [решено] Очистка папки обмена с сохранением подкаталогов
Есть папка обмена
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
Если на 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
Все эти варианты работают и удаляют все файлы в подкаталогах, но оставляют за собой пустые папки.
То есть проблема в том, что не нужно оставлять ничего кроме самих папок A,B,C.
а поискать по форуму?
CMD/BAT - [решено] программирование bat на удаление файлов из папки (http://forum.oszone.net/thread-200091.html)
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
Спасибо огромное, работает!
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.