1

Тема: VBS: Удаление в файлов корзину

Здравствуйте, уважаемые коллеги.
Сегодня решал задачу удаления файлов в корзину через VBS и заметил одну особенность. Потратил чуть больше времени, чем ожидал, надеюсь решение сэкономит ваше.
Фишка в WScript.Sleep. Без него никак. Наверное для кого-то очевидно... короче вот:


sFolderPath = "c:\temp\"
dDateDif = DateAdd("d", -7, Date)
sExt = "txt"

Set fso = CreateObject("Scripting.FileSystemObject")
Set recyclebin = CreateObject("Shell.Application").Namespace(10)

For Each oFile In fso.GetFolder(sFolderPath).Files
	If oFile.DateLastModified < dDateDif And LCase(fso.GetExtensionName(oFile.Name)) = LCase(sExt) Then			
		recyclebin.MoveHere(oFile.Path)
		WScript.Sleep 10 
	End If
Next

Вероятно в случае большого размера файлов количество миллисекунд надо будет увеличить.

2

Re: VBS: Удаление в файлов корзину

фишка не в слипе, читай содержимое корзины

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

3 (изменено: dab00, 2011-12-27 17:12:15)

Re: VBS: Удаление в файлов корзину

smaharbA пишет:

фишка не в слипе, читай содержимое корзины

Не могли бы Вы пояснить, зачем и куда читать?  Со слипом прокатило...

4 (изменено: VSVLAD, 2011-12-27 19:40:17)

Re: VBS: Удаление в файлов корзину

Читать количество файлов в исходной папке, если уменьшилось - то перемещение завершено успешно и продолжать дальше по циклу For Each. Sleep 10 не хватит если файл большой.

--
В принципе можно и не читать, операция происходит синхронно, поэтому код приостановит своё выполнение пока файл не переместится

5

Re: VBS: Удаление в файлов корзину

2VSVLAD: для перемещения неважно, большой файл или мелкий.

dab00 пишет:

…и заметил одну особенность.

VBScript: запуск файлов ассоциированным приложением

6

Re: VBS: Удаление в файлов корзину

VSVLAD, dab00 — так синхронно или асинхронно происходит?

7 (изменено: VSVLAD, 2011-12-27 20:13:13)

Re: VBS: Удаление в файлов корзину

синхронно, я проверил у себя. Запускал в среде VB6/WScript XP SP3. Появляется стандартное окошко пермещения файла, которое показывает Explorer

8

Re: VBS: Удаление в файлов корзину

в вб работают флаги, в вбс нет

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

9

Re: VBS: Удаление в файлов корзину

Проверил также в VBS, запускал без флагов... Заменил Sleep на MsgBox. Пока я не отменил перемещение, MsgBox не вылез, следовательно синхронно.

10

Re: VBS: Удаление в файлов корзину

дануна

del /q %temp%\r.txt & fsutil file createnew %temp%\r.txt 1000000000 & start "" mshta "javascript:x=new ActiveXObject('shell.application').NameSpace('::{645FF040-5081-101B-9F08-00AA002F954E}');x.MoveHere('%temp:\=/%/r.txt');window.close()" & dir %temp%\r.txt

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

11

Re: VBS: Удаление в файлов корзину

alexii пишет:

VSVLAD, dab00 — так синхронно или асинхронно происходит?

Похоже асинхронно. Я сразу обозначил, что "для кого-то очевидно...", alexii как всегда на высоте .
Видимо, как отмечено в посте, "скрипт завершает свою работу, прежде чем методы успевают отработать".

smaharbA пишет:

дануна

Это не наш метод .

12

Re: VBS: Удаление в файлов корзину

Вспомнил еще один пример асинхронной работы методов Shell.Application с которым столкнулся ранее в процессе поиска решения задачи архивирования файлов:


sZipFolderPath = "c:\temp" 'каталог для zip-архивов

With CreateObject("Scripting.FileSystemObject")
	'путь к текущему каталогу
	sFolderPath = .GetParentFolderName(WScript.ScriptFullName)
	'путь к zip-архиву
	sZipPath = sZipFolderPath & "\" & .GetBaseName(sFolderPath) & ".zip"
	'создаем пустой zip-файл
	.CreateTextFile(sZipPath, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
End With
'копируем файлы в архив
With CreateObject("Shell.Application")
	.NameSpace(sZipPath).CopyHere .NameSpace(sFolderPath).Items
End With
'без Sleep - никак, если размер каталога большой - добавляем секунд
WScript.Sleep 1000