VBS/WSH/JS - [решено] Очистка папки обмена с сохранением подкаталогов

Ответить
Аватара пользователя
ru52

VBS/WSH/JS - [решено] Очистка папки обмена с сохранением подкаталогов

Сообщение ru52 »

Есть папка обмена

C:\TMP

Содержащая несколько папок отделов с установленными соответствующими разрешениями.

C:\TMP\A

C:\TMP\B

C:\TMP\C

Требуется очищать все файлы в папке C:\TMP и во всех ее подкаталогах, при этом сохраняя сами папки отделов.



Не получается добавить в скрипт исключения удаления самих каталогов.

Подбросьте, пожалуйста, скрипт. Может сталкивался кто с такой задачей.

Спасибо!
Аватара пользователя
UpDaTe

Re: VBS/WSH/JS - [решено] Очистка папки обмена с сохранением подкаталогов

Сообщение UpDaTe »

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

Re: VBS/WSH/JS - [решено] Очистка папки обмена с сохранением подкаталогов

Сообщение megaloman »

Виноват, не посмотрел тему сообщения, но всё же батник существенно короче.

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

Re: VBS/WSH/JS - [решено] Очистка папки обмена с сохранением подкаталогов

Сообщение ru52 »

Все эти варианты работают и удаляют все файлы в подкаталогах, но оставляют за собой пустые папки.

То есть проблема в том, что не нужно оставлять ничего кроме самих папок A,B,C.
Аватара пользователя
Iska

Re: VBS/WSH/JS - [решено] Очистка папки обмена с сохранением подкаталогов

Сообщение Iska »

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

Re: VBS/WSH/JS - [решено] Очистка папки обмена с сохранением подкаталогов

Сообщение megaloman »

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



Код:

Код: Выделить всё

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

Re: VBS/WSH/JS - [решено] Очистка папки обмена с сохранением подкаталогов

Сообщение ru52 »

Цитата Роман_Волков@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 кодировке
Ответить

Вернуться в «Скриптовые языки администрирования Windows»