1 (изменено: Konstantin, 2019-05-06 06:47:54)

Тема: CMD/BAT:Выборочное удаление ненужных папок

Доброго времени суток.
Возник такой вопрос, у меня есть код:

chcp 1251
forfiles /p "D:\Новая папка" /s /m *.* /c "cmd /c Del @path" /d -2

Он удаляет все файлы из всех под папок но сами папки не трогает.
Вопрос заключается в следующем, можно ли доработать этот код так что бы он удалял только определённые папки.
Например у меня на работе есть папка Scan туда отправляются все отсканированные файлы с МФУ которая стоит у меня в кабинете в этой папке есть ещё 2 папки Buh(это для бухгалтерской МФУ) и Bib(это для МФУ которая стоит в библиотеке). Но бухгалтера любят в папке Scan создавать ещё кучу папок и отдельно перекидывать туда свои сканы и именно вот эти папки мне надо удалять а папки Buh и Bib не трогать.
Помогите кто чем сможет пожалуйста)

2

Re: CMD/BAT:Выборочное удаление ненужных папок

То есть, у Вас есть наличествует, например, такая вот структура каталогов:

C:\SCAN
├───aaaaa
├───Bib
├───Buh
├───sdhsdfhdfh
├───sgdfgdh
└───sksgksgkl

И Вам надо удалить все каталоги, отличные от Bib и Buh, так?

Пример кода:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=C:\Scan
set sExcludeFolders="Bib" "Buh"

if exist "%sSourceFolder%\." (
	pushd "%sSourceFolder%" && (
		for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:d "%sSourceFolder%\*.*"`) do (
			set bFound=
			
			for %%j in (%sExcludeFolders%) do (
				if /i "%%~i" equ "%%~j" set bFound=1
			)
			if not defined bFound echo rd /s /q "%sSourceFolder%\%%~i"
		)
		popd
	)
) else (
	echo Can't find source folder [%sSourceFolder%].
	exit /b 1
)

endlocal
exit /b 0

Для реального удаления уберите echo перед командой rd.

3

Re: CMD/BAT:Выборочное удаление ненужных папок

Спасибо, а можно как ни будь сделать что бы эти папки он не трогал а содержимое в них удалял, то есть папка Bib оставалась а содержимое её чистилось и желательно что бы чистились файлы старше определённого числа например старше 3 дней если не сложно подскажите пожалуйста.) alexii

4

Re: CMD/BAT:Выборочное удаление ненужных папок

Konstantin пишет:

а содержимое её чистилось и желательно что бы чистились файлы старше определённого числа

А каталоги? И какую берём дату — дату создания или дату последней модификации?

5

Re: CMD/BAT:Выборочное удаление ненужных папок

alexii Каталог тот же, дата последней модификации.

6

Re: CMD/BAT:Выборочное удаление ненужных папок

Konstantin, я спрашивал, что делать со вложенными каталогами, которые встретятся внутри?

7 (изменено: Konstantin, 2019-05-13 00:45:26)

Re: CMD/BAT:Выборочное удаление ненужных папок

alexii, Нужно что бы папка папка Scan чистилась полностью так же как и папки Bib и Buh но сами папки Bib и Buh оставались, ах да так же появилась папка Obmen которую не нужно чистить.

8

Re: CMD/BAT:Выборочное удаление ненужных папок

alexii ну так что поможете?

9 (изменено: alexii, 2019-05-19 13:21:31)

Re: CMD/BAT:Выборочное удаление ненужных папок

Konstantin. пробуйте (на WSH):

+ открыть спойлер
Option Explicit

Dim strSourceFolder

Dim arrExcludeFolders
Dim lngDiff

Dim objFSO
Dim objExcludeFolders
Dim strExcludeFolder


strSourceFolder   = "C:\Scan"
arrExcludeFolders = Array("Bib", "Buh", "Obmen")
lngDiff           = 3 * 24 * 60 * 60 ' Days count * Hours in day * Minutes in hour * Seconds in minute

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FolderExists(strSourceFolder) Then
	Set objExcludeFolders = WScript.CreateObject("Scripting.Dictionary")
	
	For Each strExcludeFolder In arrExcludeFolders
		objExcludeFolders.Add objFSO.BuildPath(strSourceFolder, strExcludeFolder), strExcludeFolder
	Next
	
	ScanSubFolders objFSO.GetFolder(strSourceFolder), 0
	
	objExcludeFolders.RemoveAll
	Set objExcludeFolders = Nothing
Else
	WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
	WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub ScanSubFolders(objFolder, intLevel)
	Dim objSubfolder
	Dim objFile
	Dim strExcludeFolder
	
	
	WScript.Echo String(intLevel, vbTab) & "Scan folder [" & objFolder.Path & "]"
	
	For Each objSubfolder In objFolder.SubFolders
		ScanSubFolders objSubfolder, intLevel + 1
	Next
	
	For Each objFile In objFolder.Files
		If DateDiff("s", objFile.DateLastModified, Now()) >= lngDiff Then
			WScript.Echo String(intLevel, vbTab) & "File [" & objFile.Path & "] deleted."
			objFile.Delete True
		Else
			WScript.Echo String(intLevel, vbTab) & "File [" & objFile.Path & "] skipping."
		End If
	Next
	
	If objFolder.SubFolders.Count = 0 And objFolder.Files.Count = 0 Then
		If Not objExcludeFolders.Exists(objFolder.Path) Then
			WScript.Echo String(intLevel, vbTab) & "Folder [" & objFolder.Path & "] deleted."
			objFolder.Delete True
		Else
			WScript.Echo String(intLevel, vbTab) & "Folder [" & objFolder.Path & "] excluded."
		End If
	Else
		WScript.Echo String(intLevel, vbTab) & "Folder [" & objFolder.Path & "] not empty, skipping."
	End If
End Sub
'=============================================================================

10

Re: CMD/BAT:Выборочное удаление ненужных папок

alexii спасибо попробую