1 (изменено: alexii, 2013-02-28 19:43:28)

Тема: vbs: как полностью очистить каталог?

Задача: полностью очистить произвольный каталог, удалив всё, что не захвачено системными процессами.
Вводная: в пути к каталогу существуют скрытые и системные каталоги, сам он такой же и содержит такие же подкаталоги.

Пример целевого каталога:
C:\Documents and Settings\<username>\Local Settings\Temporary Internet Files

Поиском искал, найденный рекурсивный скрипт не видит файлов в скрытых папках.
Даже не так, интереснее, некоторые файлы он видит, но возвращает только их имена, без пути, что делает не возможным их удаление.

Sub DeleteFiles(FolderPath)
    On Error Resume Next
    Set objFolderItems = objShellApp.NameSpace(FolderPath).Items()
    For Each objFolderItem In objFolderItems
        If objFolderItem.IsFolder And LCase(Right(objFolderItem.Name, 4)) <> ".zip" Then
            DeleteFiles objFolderItem.Path
        Else
            Set objFile = objFSO.GetFile(objFolderItem.Path)
            If objFile.DateCreated < ControlDate Then
                DeleteFile objFolderItem.Path
            End If
        End If
    Next
End Sub

2

Re: vbs: как полностью очистить каталог?

komr, оформите код надлежащим образом.

3

Re: vbs: как полностью очистить каталог?

ypppu, прошу прощения, я сам ему оформил.

4

Re: vbs: как полностью очистить каталог?

komr пишет:

...
Пример целевого каталога:
C:\Documents and Settings\<username>\Local Settings\Temporary Internet Files

Поиском искал, найденный рекурсивный скрипт не видит файлов в скрытых папках.
Даже не так, интереснее, некоторые файлы он видит, но возвращает только их имена, без пути, что делает не возможным их удаление.

Список файлов, включая скрытые, можете попробовать сделать так:

xcopy c:\docume~1\username\locals~1\tempor~1\*.*  /H /S /L > c:\tempIE.txt

ДОСовая команда xcopy с ключиком "/L" ничего не копирует, а только отображает полные пути к файлам.  Пути я для наглядности брал "короткие", но в работе надежнее, конечно, указывать "длинные" (вдруг там еще есть похожий длинный путь).

А если предварительно выполнить аналогичную команду, но добавив еще и ключ "/D:m-d-y" (в который надо подставить параметры контролируемой даты - как я понял по Вашему скрипту, Вам надо удалять файлы старее, чем дата в переменной "ControlDate"), то в этот список попадут по идее файлы "свежее" указанной даты. И потом этот список можно будет подсунуть второй команде XCOPY в виде списка файлов - исключений.


::: Для пользователя "roman2"
::: создание списка неудаляемых файлов, например, свежее даты "28.02.2013 00:00"
xcopy c:\docume~1\roman2\locals~1\tempor~1\*.* /H /L /S /D:02-28-2013 > c:\tempIE_ECXLUDE.txt

::: создание списка для удаления
xcopy c:\docume~1\roman2\locals~1\tempor~1\*.* /H /L /S /EXCLUDE:"c:\tempIE_ECXLUDE.txt" > c:\tempIE_for_DEL.txt

::: а просто удалить все файлы без контроля дат, можно попробовать так (не проверял):
rem DEL c:\docume~1\roman2\locals~1\tempor~1\*.* /s /q /as /ah

И само удаление на основании файла c:\tempIE_for_DEL.txt можно будет выполнить тут же в батнике, разобрав этот файл командой FOR.
"Колхоз" конечно , но думаю сработает.

WBR. Roman

5 (изменено: komr, 2013-03-01 22:24:47)

Re: vbs: как полностью очистить каталог?

Я извиняюсь,
мне по дате не надо ничего смотреть, нужно просто удалить всё, что возможно, из произвольного каталога. Код поправил. В случае с папкой временных файлов IE ничего не получается сделать этим кодом, а как решить проблему - не знаю. И хотелось бы решить всё на vbs, а не командами xcopy.


Sub DeleteFiles(FolderPath)
    On Error Resume Next
    Set objFolderItems = objShellApp.NameSpace(FolderPath).Items()
    For Each objFolderItem In objFolderItems
        If objFolderItem.IsFolder And LCase(Right(objFolderItem.Name, 4)) <> ".zip" Then
            DeleteFiles objFolderItem.Path
        Else
            Set objFile = objFSO.GetFile(objFolderItem.Path)
            DeleteFile objFolderItem.Path
        End If
    Next
End Sub

6

Re: vbs: как полностью очистить каталог?

Ещё такой код попробовал - скрытые каталоги в кэше не удалились, в ручную же удалились легко:


On Error Resume Next
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:\Documents and Settings\Admin\Local Settings\Temporary Internet Files")
Set colSubfolders = objFolder.Subfolders
For Each objSubfolder in colSubfolders
 errResults = objSubfolder.Delete
Next
Set files_col = objFolder.files
For each file_obj in files_col
 file_obj.delete(true)
Next

7

Re: vbs: как полностью очистить каталог?

Коллеги, есть варианты решения? Прошу помощи!

8

Re: vbs: как полностью очистить каталог?

Попробуйте такой способ:

strPath = "C:\Documents and Settings\Admin\Local Settings\Temporary Internet Files"
Set objFS = CreateObject("Scripting.FileSystemObject")
If objFS.FolderExists(strPath) Then
    Set objShell = CreateObject("Shell.Application")
    Set objFolderItems = objShell.NameSpace(strPath).Items
    objFolderItems.Filter 32 + 64 + 128, "*"
    For Each objItem In objFolderItems
        WScript.Echo objItem.Path
    Next
    Set objFolderItems = Nothing
    Set objShell = Nothing
Else
    WScript.Echo "Путь не найден."
End If
Set objFS = Nothing
WScript.Quit 0

9

Re: vbs: как полностью очистить каталог?

Dmitrii пишет:

Попробуйте такой способ:

Попробовал, эффект точно такой же как у скрипта выше. Скрипт выдаёт только имена файлов. А надо чтоб и путь до файла тоже присутствовал.

10

Re: vbs: как полностью очистить каталог?

Может на выполнение скрипта влияют права пользователя? Они обычные, пользовательские.

11

Re: vbs: как полностью очистить каталог?

Прикрутил такую строчку

  pushd "%userprofile%\Local Settings\Temporary Internet Files" && (rmdir /s /q "%userprofile%\Local Settings\Temporary Internet Files" & popd) 2>nul

заработало как надо. Только совсем не понятно, что в этой строке написано :-) Что означают символы "&&", "2>null" вкупе с вроде бы понятными операторами?

12

Re: vbs: как полностью очистить каталог?

«&&» — выполнить следующую команду только в том случае, если предыдущая команда вернула нулевой код возврата (что обычно говорит о её успешном выполнении).

«2>nul» — перенаправить вывод stderr (потока ошибок) на фиктивное пустое устройство (обычный результат — подавление вывода на консоль сообщений об ошибках).

«(…)» — скобки группируют несколько команд в одну группу.

«&» — символ, позволяющий объединить несколько команд в одной строке.

13

Re: vbs: как полностью очистить каталог?

komr пишет:

Прикрутил такую строчку

  pushd "%userprofile%\Local Settings\Temporary Internet Files" && (rmdir /s /q "%userprofile%\Local Settings\Temporary Internet Files" & popd) 2>nul

заработало как надо.

Если все же пришли к DOS-овой команде "rd /s /q", то можно было попробовать и ту команду "del", что я показывал ранее:


DEL "%userprofile%\Local Settings\Temporary Internet Files\*.*" /s /q /as /ah

Хотя остающаяся при этом структура папок может Вам уже вовсе и не нужна.


offtop А в связи с чем необходимость в такой чистке возникает? и как Вы ее задумываете запускать?

WBR. Roman

14 (изменено: komr, 2013-03-05 10:24:31)

Re: vbs: как полностью очистить каталог?

Rom5 пишет:

offtop А в связи с чем необходимость в такой чистке возникает? и как Вы ее задумываете запускать?

У нас половина АС теперь через браузер работает, кэш надо чистить, иначе некоторые из АС работают с глюками, опытным путём выяснили, что очистка кэша помогает.
Ясно, что не самое красивое решение, зато быстрое :-)
Запуск через скрипт регистрации пользователя в домене.

15 (изменено: bnp322, 2013-03-05 13:38:38)

Re: vbs: как полностью очистить каталог?

Чистка кеша IE (cmd):

start RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8 /min

Поиском можно найти что именно чистить, т.к. есть варианты.
Я использую именно так.

А если целиком, то при каждом входе пользователя запускается батник:

for /f %%i in ('wmic path win32_LocalTime get DayOfWeek') do set wd=%%i
IF %wd% NEQ 1 exit

DEL /q %systemroot%\*.log
DEL /q %systemroot%\*.tmp
DEL /q %systemroot%\*.bak
DEL /q %systemroot%\*.old



rd /s/q "%USERPROFILE%\Local Settings\Application Data\Google\Chrome\User Data\Default\Cache"
del /q "%userprofile%\Local Settings\Application Data\Google\Chrome\User Data\Default\History*"


start RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8 /min

16

Re: vbs: как полностью очистить каталог?

komr пишет:

эффект точно такой же как у скрипта выше.

А у такого:

F = "<путь к каталогу>"
With CreateObject("Scripting.FileSystemObject")
  .DeleteFolder F & "\*", 1
  .DeleteFile F & "\*", 1
End With

17

Re: vbs: как полностью очистить каталог?

Для JScript:

main_folder="С:\\temp";

fso=WScript.CreateObject("Scripting.FileSystemObject");
DeleteFiles(main_folder);

function DeleteFiles(sourcepath)
{
  var folder=fso.GetFolder(sourcepath);
  var files=new Enumerator(folder.Files);

  for(; !files.atEnd(); files.moveNext()) {
    var file=files.item();
      try { file.Delete(); }
      catch(e) {}
  }
  var folders=new Enumerator(folder.SubFolders);
  for(; !folders.atEnd(); folders.moveNext()) DeleteFiles(folders.item().Path);
}

18

Re: vbs: как полностью очистить каталог?

пуск - программы - стандартные - служебные - очистка диска

Я конечно далек от мысли... (с)