Компьютерный форум 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=146190)

avfiga 25-07-2009 13:39 1177336

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

Если кто то сможет помочь заранее огромное спаибо !!!!!!!!!!!

Пример скрипта:

Код:

RunForFiles "C:\Test\" 'файлы, среди которых будет производиться поиск устаревших, лежат в этой директории

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) 'удалить файл. сейчас удаление отключено для отладки.
  Next
End Function

'***************************************************************
'Возвращает True, если дата создания файла больше 14-ти дней
Function CompareDate(strFileName)
  Dim fso, f, s, i
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.GetFile(strFileName)

  i = DateDiff("d", f.DateCreated, Now)

  If i > 14 Then 'здесь указывается количество дней, которое используется для сравнения с датой создания файла, т.е., в этом примере удаляются все файлы, созданные раньше, чем 14 дней назад
      'WScript.Echo(strFileName&" "&i) 'вывести имя файла и его возраст, используется для отладки
      CompareDate = True
  Else
      CompareDate = False
  End If
End Function

'****************************************************************
'функция для извлечения пути
Function ExpandPath(strFullFileName)
  ExpandPath = Left(strFullFileName,instrrev(strFullFileName,"\"))
End Function

'***************************************************************
Function DelFile(strFullFileName)
Dim fso, F
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set F = fso.GetFile(strFullFileName)
  F.Delete
End Function

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

  FileLog = Left(WScript.ScriptName,(Len(WScript.ScriptName)-4)) & "_" & DatePart("yyyy",Date) & "_" & DatePart("m",Date) & "_" & DatePart("d",Date) & "." & "log"
  Set fso = CreateObject("Scripting.FileSystemObject")

  If (fso.FileExists(FileLog)) Then
      Set f = fso.OpenTextFile(FileLog, Forreading, True)
      r = f.Readall
      f.Close
      Set f = fso.OpenTextFile(FileLog, ForWriting, True)
      f.Write strLineToLog & vbCrLf & r
      f.Close
  Else
      Set f = fso.OpenTextFile(FileLog, ForWriting, True)
      f.Write strLineToLog
      f.Close
  End If
End Function

Этот скрипт удалит в указанной папке все файлы, которые были созданы 14 и больше дней назад.

amel27 25-07-2009 17:16 1177477

Цитата:

Цитата avfiga
как переделать его так что б он удалял все папки и файлы старше n - дней незнаю »

для файлов:
Код:

intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objDIR = objFSO.GetFolder(strFldr)
Set objCol = objDIR.Files

For Each objItem In objCol
  If DateDiff("d", objItem.DateLastModified, Now) > intDays Then objItem.Delete
Next

использование:
Код:

CScript MyScript.VBS 14 C:\TEST
для папок неясно, в смысле с рекурсией?.. приведенный в топике скрипт ищет только в текущей

avfiga 25-07-2009 17:40 1177490

Да действительно данный скрипт удаляет только файлы и только в папке C:\Test, а надо переделать так что б удалял все что есть в папке C:\Test.

amel27 26-07-2009 05:36 1177789

Цитата:

Цитата avfiga
надо переделать так что б удалял все что есть в папке C:\Test »

Код:

intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
  Dim oD, cF, cD, oI

  Set oD = objFSO.GetFolder(sFldr)
  Set cF = oD.Files
  Set cD = oD.SubFolders

  For Each oI In cF
      If DateDiff("d", oI.DateLastModified, Now) > iDays Then oI.Delete
  Next

  For Each oI In cD
      DelOld oI.Path, iDays
      If oI.Size = 0 Then oI.Delete
  Next
End Function

использование:
Код:

CScript MyScript.VBS 14 C:\TEST

avfiga 26-07-2009 15:42 1178056

Цитата:

Цитата amel27
Код:
intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
Dim oD, cF, cD, oI

Set oD = objFSO.GetFolder(sFldr)
Set cF = oD.Files
Set cD = oD.SubFolders

For Each oI In cF
If DateDiff("d", oI.DateLastModified, Now) > iDays Then oI.Delete
Next
For Each oI In cD
DelOld oI.Path, iDays
If oI.Size = 0 Then oI.Delete
Next
End Function »

Извеняюсь я в написании скриптов полный чайник! Этот блок кода необходимо подставить в страрый код?

amel27 26-07-2009 15:55 1178068

Цитата:

Цитата avfiga
Этот блок кода необходимо подставить в страрый код? »

это VBS-скрипт удаления старого содержимого каталога по дате, пример использования:
Код:

MyScript.VBS 14 C:\TEST
З.Ы. рекомендую все-таки разобраться с его работой

avfiga 26-07-2009 16:00 1178074

Большое спасибо! Если не затруднит можно добавить коментарии?

amel27 27-07-2009 10:08 1178714

avfiga, комментарии только усложнят читаемость, не в обиду - код и без того прозрачен... хотя, если очень нужно, могу сделать построчный разбор

Anton04 27-07-2009 12:30 1178847

amel27,

Спасибо за труды.
Меня тоже заинтересовал данная тема. Если не затруднит, ответь на пару вопросов:

1.Этот скрипт удаляет файлы и папки основываясь только на дату создания или дата последнего изменения тоже играет для него роль?

2.А как будет обрабатываться объект если каталог подпадает под удаление (т.е. создан раньше), а файл в этом каталоге нет (т.е. создан позже)?

amel27 27-07-2009 12:38 1178857

Anton04,

1. ".DateLastModified" - дата изменения, для удаления по дате создания заменить на ".DateCreated"
2. Сначала удаляются файлы, каталог удаляется если окажется пустым (будут удалены все файлы/подкаталоги)

Anton04 27-07-2009 13:23 1178905

amel27,

Спасибо, возьмём на заметку :clapping:

Ограничений по вложенности каталогов нет? (ну окрамя тех, что присуствуют в операционной и файловой системе)
С русскими именами тоже проблем не будет?
Я так понимаю, что саму головную папку (в примере это папка test) скрипт не трогает?
Как обстоят дела со скрытыми файлами и папками. И файлами с атрибутом только для чтения (удаляет/пропускает)?

P.S. А вот если бы он ещё создавал лог файл с неудалёнными файлами и папками (после его работы), ну вооще сказка была-бы :angel: ах мечты, мечты...

amel27 27-07-2009 15:51 1179026

Anton04, немного изменил - с удалением защищенных атрибутами и выводом удаляемых файлов:
Код:

intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
  Dim oD, cF, cD, oI

  Set oD = objFSO.GetFolder(sFldr)
  Set cF = oD.Files
  Set cD = oD.SubFolders

  For Each oI In cF
      If DateDiff("d", oI.DateLastModified, Now) > iDays Then
        WScript.Echo oI.Path
        oI.Attributes = 0
        oI.Delete
      End If
  Next

  For Each oI In cD
      DelOld oI.Path, iDays
      If oI.Size = 0 Then
        oI.Attributes = 0
        oI.Delete
      End If
  Next
End Function

пример запуска:
Код:

cscript //Nologo MyScript.VBS 14 C:\TEST >MyScript.Log

Anton04 27-07-2009 17:55 1179143

amel27,

Ещё раз спасибо.

:oszone:

Sempl2 12-08-2009 18:53 1192104

amel27, спасибо за скрипт
Меня интересует вопрос, а если в папке test есть скрытая папка с ограничением доступа, как сделать так чтоб он не выкидывал ошибку а пропускал её?

amel27 13-08-2009 01:57 1192406

Sempl2, самое постое - добавить в начало скрипта:
Код:

On Error Resume Next
P.S. при этом команды сброса атрибутов нужно удалить или закомментировать:
Код:

'        oI.Attributes = 0

Sempl2 13-08-2009 09:46 1192511

amel27, ошибку не выкидывает, но удалять не продолжает скрипт заканчивает работу на этой папке.
Можно как то сделать чтоб он пропускал её и продолжал удалять?

amel27 13-08-2009 11:17 1192598

Цитата:

Цитата Sempl2
удалять не продолжает скрипт заканчивает работу на этой папке »

понятно... :tomato2:
Цитата:

Цитата Sempl2
если в папке test есть скрытая папка с ограничением доступа »

гм... чет я загрузился... если с файлами понятно: атрибут стоит - пропускаем, нет - удаляем, а как быть с папками - пропускать ВСЁ содержимое?.. или атрибуты проверять только на папках?.. кстати, у меня VBS ругается только на атрибут RO, остальные никак не мешают удалению.

Sempl2 13-08-2009 11:40 1192618

amel27, у меня общая папка находится под DFSom, а он создает внутри папку "DfsrPrivate" на нее ограничен доступ и удалять её нельзя. Вот и надо как то сделать чтоб все старые файлы и папки чистил, а её пропускал.

amel27 13-08-2009 12:42 1192671

Sempl2, попробуй поставить строки "On Error Resume Next" в ДВА места:

- первой строкой скрипта
- первой строкой функции DelOld (сразу после строки "Function DelOld")

Sempl2 13-08-2009 15:38 1192812

amel27,
Спасибо большое все получилось :yahoo:

vitaliyboch 18-08-2009 12:59 1196565

Вот готовое решение, которое у меня выполняется через MS SMS 2003 для очистки каталогов временных папок на компьютерах пользователей.
Переменной, отвечающей за время устаревания файла является PurgeTime. В данный момент удаляются все файлы, которые старше 14 дней.

Код:

'==== Script Information Header ====
'script name:        Purge Temp
'version:                1.0
'date:                        16.07.08
'autor:                        Bochkarev Vitaly
'description:        Скрипт удаляет устаревшие временные файлы с компьютера.

'==== Script Main Logic ====
on error resume next
const PurgeTime = 14 'days

'Exceptions - folders, which will not be processed
dim aExceptions(3)
aExceptions(0) = "Default User"
aExceptions(1) = "LocalService"
aExceptions(2) = "NetworkService"
aExceptions(3) = "All Users"

set oFSO = CreateObject("Scripting.Filesystemobject")
set oShell = createobject("wscript.shell")

'Set paths
sProgramFiles = oShell.ExpandEnvironmentStrings("%ProgramFiles%")
sWinDir = oShell.ExpandEnvironmentStrings("%WinDir%")
sWinTempFolder = sWinDir & "\Temp"
sDocuments = "C:\Documents and Settings"

'Create log-file
sLogFileName = sWinTempFolder & "\PurgeTemp_" & Date
sLogFileName = Replace(sLogFileName, ".", "_")
sLogFileName = Replace(sLogFileName, "/", "_")
set oLogFile = oFSO.CreateTextFile(sLogFileName & ".log",true)
oLogFile.WriteLine "========== Start purging =========="

'Purge Windows Temporary folder
oLogFile.WriteLine vbCrLf & "========== Windows Temporary folder =========="
PurgeFolder(sWinTempFolder)

'Purge Users Temporary folder and Users Temporary Internet Files
oLogFile.WriteLine vbCrLf & "========== Users Temporary folder and Users Temporary Internet Files =========="
set oDocuments = oFSO.GetFolder(sDocuments)
set colProfiles = oDocuments.SubFolders
for each oProfile in colProfiles
        bFlag = false
        for each sException in aExceptions
                if InStr(oProfile.Path,sException) > 0 then
                        bFlag = true
                        exit for
                end if
        next
        if bFlag = false then
                PurgeFolder(oProfile.Path & "\Local Settings\Temp")
                PurgeFolder(oProfile.Path & "\Local Settings\Temporary Internet Files")
        end if
next

'Purge NOD32 Quarantine
oLogFile.WriteLine vbCrLf & "========== NOD32 Quarantine =========="
sQuarantine = sProgramFiles & "\Eset\Infected"
PurgeFolder(sQuarantine)

'Close log-file
oLogFile.WriteLine vbCrLf & "========== Stop purging =========="
oLogFile.Close

'PurgeFolder procedure
sub PurgeFolder(sFolderPath)
        set oFolder = oFSO.GetFolder(sFolderPath)
        set colFiles = oFolder.Files
        for each oFile in colFiles
                if (Date-oFile.DateLastModified) > PurgeTime and (Date-oFile.DateCreated) > PurgeTime then
                        oLogFile.Writeline oFile.Path & vbTab & oFile.DateCreated
                        oFSO.DeleteFile oFile.Path, true
                        if err.Number <> 0 then
                                oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
                                err.clear
                        end if
                        wscript.sleep 20
                end if
        next
        set colSubFolders = oFolder.SubFolders
        for each oSubFolder in colSubFolders
                PurgeFolder(oSubFolder.Path)
                if oSubFolder.Size = 0 then
                        oLogFile.Writeline oSubFolder.Path & vbTab & oSubFolder.DateCreated
                        oFSO.DeleteFolder oSubFolder.path
                        if err.Number <> 0 then
                                oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
                                err.clear
                        end if
                end if
        next
end sub


avfiga 18-08-2009 18:21 1196839

Данный скрипт удаляет только файлы, а пустые папки остаются?

vitaliyboch 18-08-2009 20:28 1196915

avfiga, он удаляет и старые файлы и папки, если они пустые.
if oSubFolder.Size = 0 then oFSO.DeleteFolder oSubFolder.path

Keeper2006 04-09-2009 15:22 1211465

Может не в тему, но всёже отпишу, искал способ удалить файлы в папке которые старше X дней, и наткнулся на утилитку forfiles.exe входящию в набор Recourse kit, с помощью её можно легко добится этих целей. К примеру
Цитата:

forfiles.exe /p D:\Backup\IM\ /s /m *.* /d -14 /c "cmd /c del /q /f @file"
Удаляет все файлы в папке D:\backup\IM\ старше 14 дней.

go it alone 28-01-2010 17:27 1332570

как добавить задание forfiles.exe в планировщик? не получается...

R0iZ 02-03-2010 07:06 1359265

Цитата:

Цитата go it alone
как добавить задание forfiles.exe в планировщик? не получается... »

Написать эту строку в батник, и засунуть его в планировщик.

POOLEET 16-07-2010 10:21 1454365

Здравствуйте, скажите а можно ли переделать этот код так что бы он удалял только скрытые файлы и перед каждым удалением спрашивал удалить файл или нет?
дата создания файла не важна.

deepred 17-07-2010 00:40 1454799

POOLEET,

Код:

StrSource  ="F:\[ Coding ]\del_hidden"                    ' проверяемая директория
Set FSO    = CreateObject("Scripting.FileSystemObject")

    For Each file in FSO.GetFolder(StrSource).Files
        IF File.Attributes and 2 Then

          PSH = MsgBox ("Вы действительно хотите удалить"  _
          & " файл" & Vbcrlf & FSO.GetFileName(File), 4+32, _
          "Удаление скрытых файлов")

          IF PSH = 6 Then: File.Delete: End IF
          Else: count = count+1: End If
    Next

    For Each SubFolder In FSO.GetFolder(StrSource).SubFolders
        IF SubFolder.Attributes and 2 Then

          PSH = MsgBox ("Вы действительно хотите удалить"  _
          & " папку" & Vbcrlf & SubFolder.Name, 4+32, _
          "Удаление скрытых файлов")

          IF PSH = 6 Then: SubFolder.Delete: End IF
          Else: count = count+1: End If
Next

    IF count > 0 Then
    MsgBox "Папка не содержит скрытых элементов", 0+64, _
    "Удаление скрытых файлов"
    End If
Wscript.Quit (0)

________________________________________________________________________

Вариант сценария на языке Jscript расположен в разделе:


Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру »
Javascript Удаление скрытых файлов » post #2
________________________________________________________________________



devids 06-06-2011 14:10 1689291

Цитата:

Цитата vitaliyboch
Вот готовое решение, которое у меня выполняется через MS SMS 2003 для очистки каталогов временных папок на компьютерах пользователей. »

А как сделать, чтобы удалялись файлы, находящиеся в папках которые задаются в переменных окружения системы и пользователя
User variables
System variables
я их меняю, а в скрипте прописаны конкретные пути к этим папкам, т.е. скрипт на изменение User variables и System variables
не смотрит...
В крайнем случае, как можно указать конкретную папку, к примеру E:\Temp

j0nathan 15-02-2012 09:48 1859155

Ребята, а можно в этом запросе:

Код:

forfiles.exe /p %temp% /s /m *.* /d -14 /c "cmd /c del /q /f @file"
сделать так чтобы оставалась 1 (последняя) копия не зависимо от даты. Это мне нужно, на случай сбоя резервного копирования т.к. этой командой я удаляю старые резервные копии.

rosalin 29-05-2012 11:28 1924357

Цитата:

Цитата vitaliyboch
Вот готовое решение, которое у меня выполняется через MS SMS 2003 для очистки каталогов временных папок на компьютерах пользователей.
Переменной, отвечающей за время устаревания файла является PurgeTime. В данный момент удаляются все файлы, которые старше 14 дней »

У меня при запуске этого скрипта ничего не происходит
ОС win 2003

права Админ, скрипт создаю с расширением vbs , где можно посмотреть лог работы скрипта

Iska 29-05-2012 11:49 1924373

Цитата:

Цитата rosalin
где можно посмотреть лог работы скрипта »

Ищите файлы вида «PurgeTemp_<Дата>*.log» в «%SystemRoot%\Temp»

Денис_Пузатков@vk 19-10-2012 11:10 2008409

Добрый день. А можно в данный скрипт внести изменении чтобы не удалялись пара каталогов с данными из папки?

Точнее, произвожу очистку папки данным скриптом, в папке есть пара папок которые оттуда перенести нельзя,можно ли видоизменить скрипт таким образом,чтобы при срабатывании он их не трогал,заранее спасибо за ответ…

Iska 19-10-2012 12:30 2008467

Цитата:

Цитата Денис_Пузатков@vk
А можно »

Можно.

Болванка кода:
Код:

Select Case objFolder.Name
    Case "Папка1", "Папка2", "Папка3"
        ' Ничего не делать
    Case Else
        ' Здесь обычное поведение для очистки из выбранного Вами скрипта
End Select

Цитата:

Цитата Денис_Пузатков@vk
в данный скрипт »

Если внимательно посмотреть на тему, то станет понятно, что только Вам известно, какой из приведённых в ней скриптов Вы называете «данным».

Денис_Пузатков@vk 19-10-2012 12:38 2008474

Прошу прошения что не указал какой именно...Вот этот
On Error Resume Next
intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
On Error Resume Next
Dim oD, cF, cD, oI

Set oD = objFSO.GetFolder(sFldr)
Set cF = oD.Files
Set cD = oD.SubFolders

For Each oI In cF
If DateDiff("d", oI.DateLastModified, Now) > iDays Then oI.Delete
Next

For Each oI In cD
DelOld oI.Path, iDays
If oI.Size = 0 Then oI.Delete
Next
End Function

если нетрудно,не могли бы вы вставить данный кусок кода в приведенный мной скрипт...спасибо..

Iska 19-10-2012 13:40 2008516

Код:

For Each oI In cD
    Select Case objFolder.Name
        Case "Папка1", "Папка2", "Папка3"
            ' Ничего не делать
        Case Else
            DelOld oI.Path, iDays
            If oI.Size = 0 Then oI.Delete
    End Select   
Next


Денис_Пузатков@vk 20-10-2012 06:51 2008883

On Error Resume Next
intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
On Error Resume Next
Dim oD, cF, cD, oI

Set oD = objFSO.GetFolder(sFldr)
Set cF = oD.Files
Set cD = oD.SubFolders

For Each oI In cF
If DateDiff("d", oI.DateCreated, Now) > iDays Then
WScript.Echo oI.Path
oI.Attributes = 0
oI.Delete
End If
Next

For Each oI In cD
Select Case objFolder.Name
Case "Test"
Case Else
DelOld oI.Path, iDays
If oI.Size = 0 Then
oI.Attributes = 0
oI.Delete
End If
End Select
Next
End Function
Задача следующая из папки надо раз в неделю удалять все файлы,кроме двух определенных папок и того что в них находиться.
Запускается скрипт bat файлом со следующим содержанием cscript //Nologo MyCleanUp.VBS 1 D:\test >MyCleanupScript.Log
Попробовал в таком виде,из корня каталога файлы удаляются, но папки с файлами находящиеся в том же каталоге нет. Что не так?

Iska 20-10-2012 07:17 2008886

Цитата:

Цитата Денис_Пузатков@vk
Case "Test" »

Коллега, освойте уже, наконец, тэг [code]. Зачем здесь «Test»? Здесь должны быть имена папок, которые должны быть пропущены:
Цитата:

Цитата Денис_Пузатков@vk
кроме двух определенных папок и того что в них находиться. »

Цитата:

Цитата Iska
Код:

Case "Папка1", "Папка2", "Папка3"
»


Денис_Пузатков@vk 20-10-2012 07:28 2008887

Еще раз извиняюсь за глупые вопросы, ибо в данном вопросе плаваю. Test -это название одной из папок как ра.з

Iska 20-10-2012 08:08 2008894

Цитата:

Цитата Денис_Пузатков@vk
Test -это название одной из папок как ра.з »

Значит, получается, что и корневая (для начала очистки) папка —
Цитата:

Цитата Денис_Пузатков@vk
D:\test »

и одна из вложенных в неё (которую надо пропускать при очистке), называются одинаково — «test»?

Денис_Пузатков@vk 20-10-2012 08:22 2008900

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

папка откуда надо удалять,задается bat файлом.в том варианте в котором у меня сейчас.

Iska 20-10-2012 11:23 2008941

Цитата:

Цитата Денис_Пузатков@vk
Папка называется Obmen, »

Тогда зачем Вы пишете, что вызываете скрипт с параметром «D:\test»:
Цитата:

Цитата Денис_Пузатков@vk
Запускается скрипт bat файлом со следующим содержанием cscript //Nologo MyCleanUp.VBS 1 D:\test >MyCleanupScript.Log »

?! Это только вводит в заблуждение. Почему сразу не написали, как Вы его вызываете с реальным параметром?

Цитата:

Цитата Денис_Пузатков@vk
в ней есть две папки, сканер и договора »

Значит указываете их имена:
Код:

Case "сканер", "договора"
или как они у Вас там на самом деле называются.

Денис_Пузатков@vk 22-10-2012 19:41 2010319

On Error Resume Next
intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
On Error Resume Next
Dim oD, cF, cD, oI

Set oD = objFSO.GetFolder(sFldr)
Set cF = oD.Files
Set cD = oD.SubFolders

For Each oI In cF
If DateDiff("d", oI.DateCreated, Now) > iDays Then
WScript.Echo oI.Path
oI.Attributes = 0
oI.Delete
End If
Next


For Each oI In cD
Select Case objFolder.Name
Case "Сканер", "Сертификаты"
Case Else
DelOld oI.Path, iDays
IF oI.Size = 0 Then
oI.Delete
End If
End Select
Next
End Function
не подскажете в чем дело,в таком виде скрипт не отрабатывает,из целевого католога удаляются файлы,но папки остаются...

Iska 22-10-2012 20:48 2010353

Цитата:

Цитата Денис_Пузатков@vk
не подскажете в чем дело… »

А Вы прислушаетесь к моей просьбе насчёт оформления кода тэгом [code]?

Денис_Пузатков@vk 22-10-2012 21:03 2010364

Код:

On Error Resume Next
intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
On Error Resume Next
Dim oD, cF, cD, oI

Set oD = objFSO.GetFolder(sFldr)
Set cF = oD.Files
Set cD = oD.SubFolders

For Each oI In cF
If DateDiff("d", oI.DateCreated, Now) > iDays Then
WScript.Echo oI.Path
oI.Attributes = 0
oI.Delete
End If
Next


For Each oI In cD
Select Case objFolder.Name
Case "Сканер", "Сертификаты"
Case Else
DelOld oI.Path, iDays
IF oI.Size = 0 Then
oI.Delete
End If
End Select
Next
End Function


Iska 23-10-2012 00:15 2010484

Угум.

Начните с того, что удалите или закомментируйте строку:
Код:

On Error Resume Next
посмотрите, что получится.

Денис_Пузатков@vk 23-10-2012 06:45 2010546

Ничего не изменилось,так же удаляются только файлы...правда теперь если пробовать запустить сам скрипт,без bat. файла,стала появляться ошибка. Строка 2 символ 1 Индексы выходит за пределы допустимого диапазона.

Iska 23-10-2012 10:27 2010597

Замечательно!

Теперь убираем второй «On Error Resume Next» из функции, добавляем требование обязательного предварительного объявления переменных «Option Explicit», добавляем объявления переменных, меняем «objFolder» на «oI», расставляем отступы для удобства чтения:
читать дальше »
Код:

Option Explicit

Dim intDays
Dim strFldr
Dim objFSO

intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")

DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
        Dim oD, cF, cD, oI
       
        Set oD = objFSO.GetFolder(sFldr)
        Set cF = oD.Files
        Set cD = oD.SubFolders
       
        For Each oI In cF
                If DateDiff("d", oI.DateCreated, Now) > iDays Then
                        WScript.Echo oI.Path
                        oI.Attributes = 0
                        oI.Delete
                End If
        Next
       
        For Each oI In cD
                Select Case oI.Name
                        Case "Сканер", "Сертификаты"
                        Case Else
                                DelOld oI.Path, iDays
                               
                                If oI.Size = 0 Then
                                        oI.Delete
                                End If
                End Select
        Next
End Function


и снова пробуем.

Денис_Пузатков@vk 24-10-2012 10:06 2011168

попробовал,файлы трет а папки в каталоге не удаляет....

Iska 24-10-2012 13:30 2011278

Цитата:

Цитата Денис_Пузатков@vk
а папки в каталоге не удаляет.... »

В этих не удалённых папках остаются какие-либо папки/файлы?

Денис_Пузатков@vk 24-10-2012 22:39 2011577

Да остаются.

Iska 25-10-2012 01:49 2011674

Цитата:

Цитата Денис_Пузатков@vk
Цитата:

Цитата Iska
В этих не удалённых папках остаются какие-либо папки/файлы? »

Да остаются. »

Потому папки и не удаляются.

А эти оставшиеся файлы — они действительно не старше указанного Вами при вызове скрипта числа дней?

Денис_Пузатков@vk 25-10-2012 10:01 2011771

нет не старше....посмотрел внимательней,одна папка пустая есть

Iska 26-10-2012 23:39 2013022

Цитата:

Цитата Денис_Пузатков@vk
нет не старше....посмотрел внимательней,одна папка пустая есть »

Значит, пинайте автора скрипта ;).

DNBshon 04-04-2013 13:41 2125590

У меня непонятка со скриптом. Он должен удалять файлы в сети в папках с русскими именами и с пробелами, но не делает этого, выдает ошибку. Говорят раньше он работал. Писал его не я, да и особо в этом не разбираюсь.

Собственно сам скрипт:

Код:

'Производит поиск устаревших файлов и удаляет файлы старше 50 дней

set fso=Wscript.CreateObject("Scripting.FileSystemObject")
Set Dict = CreateObject("Scripting.Dictionary")
Dict.Add "01", "\\vek\cr\Документы\`Сканированые изображения`\Бухгалтерия"
Dict.Add "02", "\\vek\cr\Документы\`Сканированые изображения`\Технический отдел"
Dict.Add "03", "\\vek\cr\Документы\`Сканированые изображения`\Отдел кадров"
Dict.Add "04", "\\vek\cr\Документы\`Сканированые изображения`\Комната ТП"
Dict.Add "05", "\\vek\cr\Документы\`Сканированые изображения`\Отдел логистики"

Arr = Dict.Items

For i=0 To Dict.Count-1
        Set fs = CreateObject("ScriptCodingInfo.FileSystem")
        For Each f1 In fs.WalkFiles(Arr(i))
        d = f1.DateLastModified
        diff = DateDiff("d",d,Now)
                if diff > 50 Then
                fso.DeleteFile (Arr(i) & "\" & f1.name)
        end if
        Next
Next


Iska 04-04-2013 17:06 2125700

Цитата:

Цитата DNBshon
но не делает этого, выдает ошибку. »

Какую ошибку? Нажмите «Ctrl-C» в окне с сообщением об ошибке, затем вставьте полученный текст из буфера обмена сюда, обрамив его тэгом «code».

lipro122 16-04-2013 13:15 2133645

Цитата:

Цитата Iska
Код:
For Each oI In cD
Select Case objFolder.Name
Case "Папка1", "Папка2", "Папка3"
' Ничего не делать
Case Else
DelOld oI.Path, iDays
If oI.Size = 0 Then oI.Delete
End Select
Next »


Так ...
А как сделать так , чтоб в этих Case "Папка1", "Папка2", "Папка3" , данные удалялись ... а сами папки нет ?

Iska 16-04-2013 15:34 2133766

Чтобы не удалялись пустые папки, закомментируйте строку
Код:

If oI.Size = 0 Then oI.Delete
Чтобы папки "Папка1", "Папка2", "Папка3" попадали в обработку — уберите само условие «Select Case …».

Добиться данным скриптом корректной работы, чтобы данные удалялись, а папки — частично удалялись, частично нет, не получится. Ибо автором был изначально выбран неверный путь ориентации на размер папки при удалении (правильный путь — проверка количества вложенных папок и файлов).

lipro122 16-05-2013 17:06 2151105

для файлов:
Код:

Код:

intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objDIR = objFSO.GetFolder(strFldr)
Set objCol = objDIR.Files

For Each objItem In objCol
  If DateDiff("d", objItem.DateLastModified, Now) > intDays Then objItem.Delete
Next

использование:

Код:

CScript MyScript.VBS 14 C:\TEST
Подскажите по поводу данного куска кода.
Особенно второй аргументы.
Меня интересует если в названии папки присутствует пробел.

например C:\Program Files\ он правильно примет аргументы ?
Или нужно будет указать "C:\Program Files\" ?

Iska 17-05-2013 03:31 2151357

Цитата:

Цитата lipro122
использование:
Код:

CScript MyScript.VBS 14 C:\TEST

Меня интересует если в названии папки присутствует пробел. »

Правильное использование:
Код:

cscript.exe //nologo "Путь\MyScript.VBS" "C:\TEST TEST TEST"
Цитата:

Цитата lipro122
например C:\Program Files\ он правильно примет аргументы ?
Или нужно будет указать "C:\Program Files\" ? »

Код:

cscript.exe //nologo "Путь\MyScript.VBS" "C:\Program Files"
P.S. Лучше сразу заиметь привычку заключать пути в качестве аргументов скриптов WSH в кавычки, независимо от наличия в них пробелов. Привыкнете — станете делать сие автоматически.

lipro122 17-05-2013 09:02 2151388

Цитата:

Цитата Iska
P.S. Лучше сразу заиметь привычку заключать пути в качестве аргументов скриптов WSH в кавычки, независимо от наличия в них пробелов. Привыкнете — станете делать сие автоматически. »

Привыкну ))) .. мне так удобнее )))... спасибо большое.

artem_cher 26-09-2013 10:28 2224223

Здравствуйте, можете мне кто нито помочь? Ситуация такая, нужен скрипт или программка которая будет удалять вложенные папки с файлами из рабочей директории. То есть имеется сервер на котором делается бэкап, (e:/backup) в этой директории создается папка с датой создания>туда копируется дамп базы, и после этого он в ней архивируется в rar архив. Но есть одно но, иногда дамп снимается с ошибками и он не архивируется или недоорхивируется, нужно что бы скрипт проверял перед удалением папки, что бы всегда в директории оставалась последний актуальный бэкап. (По хорошему завершению бэкапа, в папке с датой остается один файл Export.rar, если что то не так в папке много файлов).

Iska 26-09-2013 12:47 2224299

artem_cher, хорошо бы изложить то же самое, но по-русски.

zhuk09 18-11-2015 16:28 2576185

Добрый день!
Подниму старую тему)!
Необходимо для этой части кода
Код:

intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objDIR = objFSO.GetFolder(strFldr)
Set objCol = objDIR.Files

For Each objItem In objCol
  If DateDiff("d", objItem.DateLastModified, Now) > intDays Then objItem.Delete
Next

Добавить рекурсивное удаление файлов во всех вложенных папках переменной strFldr
Спасибо!

zhuk09 23-11-2015 14:36 2578086

Цитата:

Цитата zhuk09
Добавить рекурсивное удаление файлов во всех вложенных папках переменной strFldr »

С этим вроде бы справились, для удаления только файлов, удалили строку
Код:

If oI.Size = 0 Then oI.Delete
Сам скрипт выглядит так
Код:

intDays = 1
strFldr = "D:\Work"

Set objFSO = CreateObject("Scripting.FileSystemObject")
DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
On Error Resume Next
  Dim oD, cF, cD, oI

  Set oD = objFSO.GetFolder(sFldr)
  Set cF = oD.Files
  Set cD = oD.SubFolders

  For Each oI In cF
      If DateDiff("d", oI.DateLastModified, Now) > iDays Then oI.Delete
  Next

  For Each oI In cD
      DelOld oI.Path, iDays
      Next
End Function


kaelrnd 10-05-2016 13:06 2633487

Добрый день, нужен скрипт или программа, ну или другое решение для следующей ситуации: IP камера записывает видеофайлы и файлы log в расшаренную папку на одном из компов в сети, данные файлы записываются в папку имеющую название в виде даты, в ней создаются папки с названием равным текущем времени, в данные папки соответственно записываются видеозаписи и файлы лог. Требуется, чтобы раз в 3-4 дня удалялась самая старая папка (места на диске мало и когда оно кончается, видео перестает писаться). Также, хотелось бы, чтобы из общей папки, где создаются все эти файлы и папки удалялись файлы *.log (эти файлы создаются, когда камера фиксирует движение и их достаточно много).
Может ли кто помочь в решении данного вопроса?

Dimu4 07-06-2016 23:36 2641214

Подскажите, пожалуйста можно ли автоматизировать вот это действие:
Windows7, в которой 20 пользователей, раз в неделю нужно на каждой из них почистить папки - C:\Users\userNNN\AppData\Local\Temp для каждого пользователя(имя пользователей в формате user_NNN)

Iska 07-06-2016 23:55 2641220

Dimu4, можно.

Dimu4 08-06-2016 00:23 2641224

У меня была вот такая мысль - создать cmd файл, в нем
Код:

forfiles.exe /p %temp% /s /m *.* /d -14 /c "cmd /c del /q /f @file"
Вместо %temp% написать путь к каждой папке которую надо почистить и создать сценарий как тут - https://www.youtube.com/watch?v=-l24UCfQ7Cg который будет при выходе из системы или перезагрузке чистить папки пользователей.
Может есть еще подсказки/идеи?
Спасибо

Iska 08-06-2016 10:58 2641321

Например, назначьте групповой политикой на Logout пользователям:
Скрытый текст
Код:

Option Explicit

Const TemporaryFolder = 2
Const intDays2Live  = 30

Dim strPathToClear


With WScript.CreateObject("Scripting.FileSystemObject")
        strPathToClear = .GetSpecialFolder(TemporaryFolder)
       
        If .FolderExists(strPathToClear) Then
                ClearSubFolders .GetFolder(strPathToClear)
        Else
                WScript.Quit 1
        End If
End With

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

'=============================================================================
Sub ClearSubFolders(objFolder)
        Dim objSubFolder
        Dim objFile
       
       
        For Each objSubFolder In objFolder.SubFolders
                ClearSubFolders objSubFolder
        Next
       
        For Each objFile In objFolder.Files
                If DateDiff("d", objFile.DateLastModified, Now()) > intDays2Live Then
                        objFile.Delete True
                End If
        Next
       
        If (objFolder.Files.Count = 0) And (objFolder.SubFolders.Count = 0) Then
                If objFolder.Path = strPathToClear Then
                        ' Nothing to do
                Else
                        objFolder.Delete True
                End If
        End If
End Sub
'=============================================================================


dreyAn 03-03-2019 20:22 2861080

Здравствуйте, господа.
Во-первых, хочу поблагодарить за данные скрипты, особенно за:
Код:

On Error Resume Next
intDays = Int(Wscript.arguments.Item(0))
strFldr = Wscript.arguments.Item(1)

Set objFSO = CreateObject("Scripting.FileSystemObject")
DelOld strFldr, intDays

Function DelOld(sFldr, iDays)
On Error Resume Next
  Dim oD, cF, cD, oI

  Set oD = objFSO.GetFolder(sFldr)
  Set cF = oD.Files
  Set cD = oD.SubFolders

  For Each oI In cF
      If DateDiff("d", oI.DateLastModified, Now) > iDays Then
        WScript.Echo oI.Path
        oI.Attributes = 0
        oI.Delete
      End If
  Next

  For Each oI In cD
      DelOld oI.Path, iDays
      If oI.Size = 0 Then
        oI.Attributes = 0
        oI.Delete
      End If
  Next
End Function

Во-вторых, прошу Вас его улучшить вот в каком плане.
Сейчас для выполнения вышеозначенного кода я использую для очистки папки "Загрузки" вот такую команду:
Код:

cscript //Nologo c:\scripts\MyCleanUp.VBS 30 %USERPROFILE%\Downloads > c:\scripts\MyCleanupScript_Downloads.Log
Что в принципе, не правильно, так как значение пути к папке "Загрузки" можно изменить на любое, и куда она точно ссылается можно определить только из реестра:
"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
Значение параметра: {374DE290-123F-4565-9164-39C4925E467B}
Можно ли дополнить команду запуска, либо сам скрипт так, чтобы путь к папке "Загрузки" подставлялся автоматически из реестра, а ещё лучше, что-то типа:
Код:

cscript //Nologo c:\scripts\MyCleanUp.VBS 30 c:\scripts\ПапкиДляОчистки.list > c:\scripts\MyCleanupScript.Log
где ПапкиДляОчистки.list -- текстовый файл с перечнем папок, которые надо чистить, например:
Код:

%temp%
%windir%\temp
%USERPROFILE%\Downloads

Заранее благодарю

corecore 07-01-2023 18:50 3000461

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


Время: 15:18.

Время: 15:18.
© OSzone.net 2001-