powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Windows [игнор отключен] [закрыт для гостей] / скрипт выборочного удаления файлов
25 сообщений из 25, страница 1 из 1
скрипт выборочного удаления файлов
    #36101115
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите, не могу никак побороть скрипт ;)
Задача: необходимо в конкретной папке удалить все файлы (удовлетворяющие условию) и пустые папки. Также необходимо исключить из удаления конкретную папку и подпапки в ней.

вот мой скрипт:
Код: plaintext
1.
2.
FORFILES /P c:\test\test\ /S /D - 10  /C "cmd /c del /q @file && echo @path @fdate deleted >> C:\test\RemOldFiles\logs.txt"

FORFILES /P c:\test\test\ /S /C "cmd /c if @isdir==TRUE ( if @fsize EQU 0 ( rmdir @file )) && echo @path - @fdate - folder deleted >> C:\test\RemOldFiles\logs.txt"

Этот скрипт делает первое действие (удаляет файлы и папки). Как теперь его преобразовать, чтобы он исключал из удаления ..ну скажем.. папку c:\test\test\test3 ?
То есть даже если все файлы, подпапки и все что есть в этой папке и сама папка НЕудалялись.

Помогите пожалуйста.
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36101125
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть еще такой вариант выбора списка файлов:

Код: plaintext
dir c:\test\ /s /b > c:\file.tmp | for /F %i in (c:\file.tmp) do if %i==c:\test\test\bla* @echo BLA

Все что после "DO" - не срабатывает. :(
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36101518
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Придумал че-то новое ;)
Подскажите, как удалить из файла строку, а то не могу найти :(
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36102341
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никто не помог, но я разобрался сам. Вдруг кому пригодится и поможет :)

@forfiles /p c:\test\ /s /d -10 /c "cmd /c @echo @path >> c:\test.txt & echo @path"
rem выбираем файлы и папки, которые удовлетворяют условию и записываем их в файл.

@find /i /v "c:\test\test\bla" c:\test.txt >> c:\test2.txt
rem в первом файле ищем все строки путей КРОМЕ тех, которые надо удалить
и записываем их во второй файл. (это и есть исключение)

@FOR /F "skip=2" %%i IN (c:\test2.txt) DO (@echo "%%~i" & del %%~i)
rem из второго файла по циклу удаляем файлы и папки подставляя пути, оставшиеся
во втором файле.

Пользуйтесь на здоровье. :)
НО помните! Удаленные таким способом файлы восстановить НЕ УДАСТСЯ! :)
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36102982
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, помогите снова.
Этот скрипт не будет работать с украинскими названиями папок и файлов. (и некоректно с русскими).

Как это обойти или как реализовать эту задачу для любого языка?
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36103038
Фотография С0ВЕСТЬ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АндрейчикНарод, помогите снова.
Этот скрипт не будет работать с украинскими названиями папок и файлов. (и некоректно с русскими).

Как это обойти или как реализовать эту задачу для любого языка?
А если подставлять в кавычках?
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36103749
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С0ВЕСТЬ,
как именно в кавычках? тыкни пальцем в место в скрипте, пожалуйста, а то уже мозги кипят :(
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36103765
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Также нашел готовый скрипт на WMI, проблема - удаляет файлы только в одной директории (которую указываешь при запуске скрипта).

Как изменить функцию, чтобы она сканировала все папки и подпапки?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Function RunForFiles(folderspec)
   Dim fso, f, f1, fc

   Set fso = CreateObject("Scripting.FileSystemObject")
   Set f = fso.GetFolder(folderspec)
   Set fc = f.Files
   For Each f1 in fc
      WScript.Echo (folderspec & f1.name) 'вывод сообщения с именем файла, который будет удален. используется в тестовых целях, в рабочем скрипте нужно отключить
      If CompareDate(folderspec & f1.name) = True Then
          Log(folderspec & f1.name)
          'DelFile(folderspec & f1.name) 'удалить файл. сейчас удаление отключено для отладки.
      End If
   Next
End Function 

Ну и если можно, то чтобы исключалась конкретная папка и все что в ней от удаления.

Заранее спасибо.
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36104468
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это процедура удаления файлов в папке, имя которой задано в параметре
Но она не тронет вложенные папки.

Здесь добавлен цикл по папкам:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Function RunForFiles(folderspec)
   Dim fso, f, f1, fc

   Set fso = CreateObject("Scripting.FileSystemObject")
   Set f = fso.GetFolder(folderspec)

   ' цикл по всем файлам папки
   Set fc = f.Files
   For Each f1 in fc
      WScript.Echo (folderspec & f1.name) 'вывод сообщения с именем файла, который будет удален. используется в тестовых целях, в рабочем скрипте нужно отключить
      If CompareDate(folderspec & f1.name) = True Then
          Log(folderspec & f1.name)
          'fso.DeleteFile folderspec & f1.name 'удалить файл. сейчас удаление отключено для отладки.
      End If
   Next

   ' цикл по всем вложенным папкам 
   Set fc = f.Folders
   For Each f1 in fc
      WScript.Echo (folderspec & f1.name) 'вывод сообщения с именем папки, который будет удален. используется в тестовых целях, в рабочем скрипте нужно отключить
      If CompareDate(folderspec & f1.name) = True Then
          Log(folderspec & f1.name)
          'fso.DeleteFolder folderspec & f1.name 'удалить папку. сейчас удаление отключено для отладки.
      End If
   Next

End Function 

Управлять удалением файла или папки должна функция CompareDate(folderspec & f1.name),
которая проверяет полученное имя и разрешает удаление - возвращая true, либо запрещает его - возвращая false.

Метод DeleteFolder удаляет папку со всем содержимым. Так что если и во вложенных папках надо что то оставлять, то смотри в сторону рекурсии.
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36104550
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
golsaМетод DeleteFolder удаляет папку со всем содержимым. Так что если и во вложенных папках надо что то оставлять, то смотри в сторону рекурсии.

Вот мне и необходимо рекурсивно проверять папку и все подпапки в ней, и удалять файлы как в корневой папке, так и в подпапках. Не поможешь осуществить данный скрипт? а то я в этом языке скриптов пока новичек.
(вопросик: а это средство работает с любыми языками? русские и украинские папки и файлы оно тоже удалит? и если в именах пробелы например, тоже сработает?)
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36110181
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался. Все сделал. Всем спасибо.
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36111397
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Народ, дополнительные условия выяснились. как удалять скрытые, системные, только для чтения, вобщем как проверять атрибуты, менять их на нормальные и удалять потом?

2. Как указать несколько папок для исключения удаления?
Как в переменной указать несколько, например тут:
[code}objpath = "D:\папка-исключение\"
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36111401
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрейчик1. Народ, дополнительные условия выяснились. как удалять скрытые, системные, только для чтения, вобщем как проверять атрибуты, менять их на нормальные и удалять потом?

2. Как указать несколько папок для исключения удаления?
Как в переменной указать несколько, например тут:
Код: plaintext
objpath = "D:\папка-исключение\"
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36111407
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрейчик1. Народ, дополнительные условия выяснились. как удалять скрытые, системные, только для чтения, вобщем как проверять атрибуты, менять их на нормальные и удалять потом?
Для удаления проверять не надо, надо сразу назначать аттрибуты, функция attrib, потом не гляда удалять.
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36111659
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Podgoretsky,

Да, спасибо, я уже это нашел :) Остается актуальным второй вопрос. :(
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36111761
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрейчик
2. Как указать несколько папок для исключения удаления?
Как в переменной указать несколько, например тут:
Код: plaintext
objpath = "D:\папка-исключение\"


Вобщем если словами изложить мысль, то примерно она звучит так:
Из конкретной папки очищаем пустые папки (или ненужные файлы и папки).
Но! Есть пара-тройка папок которые надо исключить из очистки.
Как это сделать?
Например с одной папкой я проверял так: если путь данной папки не равен пути папки-исключения, то продолжаем очистку. Иначе - переходим к следующей папке.
Задача: если путь данной папки имеется в массиве папок-исключений - переходим к следующей, если не входит в массив - очищаем папку.
Если вопрос не понятен, напишите - изложу еще подробнее :)
Заранее спасибо за помощь.
Вот мой скрипт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "D:\Test\"     ' папка которую очищаем
objpath = "D:\Test\ne_trogat\"   ' папка которую исключаем из очищения
Set objFolder = objFSO.GetFolder(objStartFolder)
'    Wscript.Echo objFolder.Path
Set colFiles = objFolder.Files
For Each objFile in colFiles
	If DateDiff("D", objFile.DateLastModified, Now) > 10 Then    ' проверка файлов на старость
'            Wscript.Echo objfolder.Path & "\" & objFile.Name & " - " & objFile.DateLastModified
Log (objFolder.Path & objFile.Name)
'	Wscript.Echo objFile.Delete
	objFile.Attributes =  0 
	objFile.Delete
	End If
Next
'-----   Wscript.Echo
ShowSubfolders objFSO.GetFolder(objStartFolder)
Sub ShowSubFolders(Folder)
    For Each Subfolder in Folder.SubFolders
Set objFolder = objFSO.GetFolder(subfolder.Path)
'   Wscript.Echo objfolder.Path
if objfolder.path <> objpath then
        Set colFiles = objFolder.Files
        For Each objFile in colFiles
	If DateDiff("D", objFile.DateLastModified, Now) >  10  Then      ' проверка файлов на старость
'            Wscript.Echo Subfolder.Path & "\" & objFile.Name & " - " & objFile.DateLastModified
Log (objFolder.Path & "\" & objFile.Name)
'	Wscript.Echo objFile.Delete
	objFile.Attributes = 0
	objFile.Delete
	End If
        Next
'-----      Wscript.Echo
        ShowSubFolders Subfolder
else
Wscript.Echo subfolder.path & " - " & "udalat` nizzya"
End If
   Next
End Sub
End Function
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36114678
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Папки можно занести в objpath заканчивая каждую знаком запрещенным в path (например *?$), и вместо сравнения использовать поиск подстроки в строке.

Для получения такой строки можно использовать функцию Join(list[, delim]) , которая возвращает строку, полученную в результате конкатенации подстрок, содержащихся в массиве list. Параметр delim задаёт символ разделителя (по умолчанию - пробел).

Например так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
nodelete( 1 )  = "D:\Test\ne_trogat\"
nodelete( 2 )  = "D:\Test\ne_trogat1\"
...
nodelete(N)  = "D:\Test\ne_trogatN\"

objpath = Join(nodelete,"*") & "*"        
            или сразу

objpath = "D:\Test\ne_trogat\*D:\Test\ne_trogat1\* ... D:\Test\ne_trogatN\*"
...
if InStr(objpath, objfolder.path & "*") <  1  then   ' это вместо if objfolder.path <> objpath then
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36114749
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
golsaНапример так:

Код: plaintext
1.
...
if InStr(objpath, objfolder.path & "*") <  1  then  


Не могли бы Вы пояснить эту строку просто словами, я не могу понять смысл кода. :(
Заранее спасибо.
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36115490
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "D:\test\" 'папка которую очищаем
arrPath =array("D:\test\1","D:\test\2", "D:\test\3") 'папки которые исключаем

ShowSubfolders objFSO.GetFolder(objStartFolder)
Sub ShowSubFolders(Folder)
For Each Subfolder in Folder.SubFolders
	Set objFolder = objFSO.GetFolder(subfolder.Path)
p=false
i=lbound(arrpath)
WHILE (p=false) and (i<=ubound(arrpath))
	if (objfolder.path=arrpath(i) ) then
		p=true
	end if
	i=i+ 1 
WEND
if (not p) then
'	Wscript.Echo objfolder.path & " - " & "udalat` mozna"
	'  1 ) проверить файлы на старость
Set colFiles = objFolder.Files
For Each objFile in colFiles
	If DateDiff("D", objFile.DateLastModified, Now) >  10  Then ' проверка файлов на старость
	Log (objFolder.Path & "\" & objFile.Name)
	objFile.Attributes = 0
	objFile.Delete
	End If

Next
	'  2 ) проверить каталог на пустоту

If ((objfolder.SubFolders.Count =  0 ) AND (objfolder.Files.Count =  0 )) Then
	Log(objfolder.Path)
	Wscript.Echo objfolder.Path & " - " & "papku udalat` mozna"
	objfolder.Attributes =  0 
	objFSO.DeleteFolder(objfolder.Path)
End if

	ShowSubFolders Subfolder

else 

'	Wscript.Echo objfolder.path & " - " & "udalat` nizzya"
end if

next

end sub

'функция для создания log-файла. он создается рядом со скриптом, имя - дата запуска скрипта.

Function Log(strLineToLog)
Const ForReading =  1 , ForWriting =  2 
Dim fso, f, FileLog

Set fso = CreateObject("Scripting.FileSystemObject")
FileLog = Left(WScript.ScriptName,(Len(WScript.ScriptName)- 4 )) & "_" & DatePart("yyyy",Date) & "_" & DatePart("m",Date) & "_" & DatePart("d",Date) & "." & "log"
Set f = fso.OpenTextFile(FileLog,  8 , True)
f.Write strLineToLog & vbCrLf
f.Close
End Function

Вот у меня такой скрипт. Почему то при выполнении происходит одна итерация и выдает ошибку:
"Путь не найден". Строка 7.
Кто может подсказать, где в срипте бок?
Экспериментально обнаружил, что рекурсивно доходит до последней папки. Если она пустая - удаляет ее. Подниматся на уровень вышеи и тут выскакивает эта ошибка. Почему?
Заранее спасибо.
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36122870
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проблема все еще актуальна :(
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36123495
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекурсия - это когда при возврате на предыдущий уровень восстанавливаются значения всех переменных. У вас на всех уровнях используются одни и те же переменные. Поэтому движение у вас одностороннее - возвращаться то не куда.
Используйте команду:
Код: plaintext
dir /b /on /s > filelist.txt
а потом обрабатывайте его. Так вы уйдете от рекурсии в вашем скрипте.
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36131545
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
golsaРекурсия - это когда при возврате на предыдущий уровень восстанавливаются значения всех переменных. У вас на всех уровнях используются одни и те же переменные. Поэтому движение у вас одностороннее - возвращаться то не куда.
Используйте команду:
Код: plaintext
dir /b /on /s > filelist.txt
а потом обрабатывайте его. Так вы уйдете от рекурсии в вашем скрипте.

Спасибо за такой вариант :) Но перед написанием этого, у меня был скрипт простой, в батнике. Обычные команды командной строки с записью списка содержимого папок в файл, и дальнейшее его считывание.
Но во-первых: при работе с командной строкой не считываются папки на украинском языке. ДОС просто не понимает его символы ;) следовательно при отработке скрипта возникает ошибка получения названия папки (она видется иероглифами).
Во-вторых: решение задачи таким примитивным способом руководству не понравилось. :) вот и пришлось изучать VBScript.
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36131557
Андрейчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот выкдадываю свой окончательный вариант скрипта (с рекурсией). Вдруг кому понадобиться ;)
Удаление старых файлов и пустых папок.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "c:\Test\" 'папка которую очищаем
arrPath =array("c:\Test\","c:\Test\test1","c:\Test\test2", "c:\Test\test3") 'папки которые исключаем

Set objFolder = objFSO.GetFolder(objstartfolder)
Set colFiles = objFolder.Files
For Each objFile in colFiles
	If DateDiff("D", objFile.DateLastModified, Now) >  10  Then ' проверка файлов на старость
	Log (objFolder.Path & "\" & objFile.Name & " - " & objFile.DateLastModified)
	objFile.Attributes = 0
	objFile.Delete
	End If
Next

ShowSubfolders objFSO.GetFolder(objStartFolder)
Sub ShowSubFolders(Folder)
For Each Subfolder in Folder.SubFolders
	Set objFolder = objFSO.GetFolder(subfolder.Path)
p=false
i=lbound(arrpath)
WHILE (p=false) and (i<=ubound(arrpath))
	if (objfolder.path=arrpath(i) ) then
		p=true
	end if
	i=i+1
WEND
if (not p) then
'	Wscript.Echo objfolder.path & " - " & "udalat` mozna"
	' 1) проверить файлы на старость
Set colFiles = objFolder.Files
For Each objFile in colFiles
	If DateDiff("D", objFile.DateLastModified, Now) > 10 Then ' проверка файлов на старость
	Log (objFolder.Path & "\" & objFile.Name & " - " & objFile.DateLastModified)
	objFile.Attributes =  0 
	objFile.Delete
	End If
Next
	' 2) проверить каталог на пустоту
If objFolder.Subfolders.Count > 0 then
ShowSubFolders SubFolder
End If 
	If subFolder.Files.Count > 0 AND subFolder.Subfolders.Count > 0 then
'	MsgBox "Directory " & subFolder & "- ne pusta."
	else
	Log(subFolder.Path & " - " & subFolder.Datecreated)
	objFSO.DeleteFolder(subFolder.Path)	
	End If
End If
Next
end sub

'функция для создания log-файла. он создается рядом со скриптом, имя - дата запуска скрипта.
Function Log(strLineToLog)
Const ForReading =  1 , ForWriting =  2 
Dim fso, f, FileLog

Set fso = CreateObject("Scripting.FileSystemObject")
FileLog = Left(WScript.ScriptName,(Len(WScript.ScriptName)- 4 )) & "_" & DatePart("yyyy",Date) & "_" & DatePart("m",Date) & "_" & DatePart("d",Date) & "." & "log"
Set f = fso.OpenTextFile(FileLog,  8 , True)
f.Write strLineToLog & vbCrLf
f.Close
End Function
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36343839
НЕОЧЕНЬ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я вообще мало чо понимаю. Я прочитал вашу тему и не смог найти ответ свой вопрос (( Помогите. Мне надо написать легкий cmd скрипт на удаление. Мне нужен скрипт на то что бы удалить папки и файлы в папке c:\111 . И файл в которой бы я записал определенные пути папок и файлов которые бы остались в c:\111 после зачистки.
Скрипт на удаление я создал вот так:

pushd c:\pavel
rd /s /q .
popd
...
Рейтинг: 0 / 0
скрипт выборочного удаления файлов
    #36343901
НЕОЧЕНЬ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где c:\pavel там то есть иммею ввиду c:\111
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Windows [игнор отключен] [закрыт для гостей] / скрипт выборочного удаления файлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]