Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Очистка папки обмена с сохранением подкаталогов (http://forum.oszone.net/showthread.php?t=202704)

ru52 22-03-2011 16:34 1641117

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

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

megaloman 22-03-2011 19:17 1641280

Код:

Del C:\Tmp\*.* /A:R /A /S /Q

UpDaTe 22-03-2011 19:44 1641295

Если на 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 1641427

Виноват, не посмотрел тему сообщения, но всё же батник существенно короче.
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 1641654

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

Busla 23-03-2011 09:18 1641661

а поискать по форуму?
CMD/BAT - [решено] программирование bat на удаление файлов из папки

Iska 23-03-2011 09:29 1641666

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 1641992

Если надо в папке сохранить подпапки в её корне, и удалить все файлы и папки в них, в моём решении замените подпрограмму на вот эту
Код:

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 1642084

Спасибо огромное, работает!

megaloman 17-01-2015 10:41 2457379

Цитата:

Цитата Роман_Волков@vk
...мне нужно содержание одной папки в корневом каталоге оставлять нетронутым. Подскажите, пожалуйста, как это сделать?

Код:

@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 кодировке


Время: 11:02.

Время: 11:02.
© OSzone.net 2001-