1 (изменено: alexii, 2012-09-07 08:35:58)

Тема: VBS проверка существования файла по маске

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

Dim FSO,FileName                                              'Объявляем переменные
Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 'Создаем объект FileSystemObject
iDir = "O:\instr\1\"                                     'Директория где проверяем наличие файла
file = "O:\instr\1\*.RTF"                             'Маска файлов

i=0 
do while i = 0

Set Files = FSO.GetFolder(iDir).Files

set WshShell = CreateObject("WScript.Shell") 
WScript.Sleep 5000                                         'Сколько ждать? (1000=1секунда)

For each File In Files
if  FSO.FileExists(file)  Then 
fl=fl+1
end if
next
if fl<>0 then
    MsgBox ("Пришел файл!")                                     'Выводим сообщение
end if
loop

вот приходит файл, появляется сообщение, но если его удалить, сообщение так и выводится! Помогите! В VBS недавно пишу))

2 (изменено: Fedor, 2012-09-07 00:41:20)

Re: VBS проверка существования файла по маске

Есть увереность что скрипт различит:
file = "O:\instr\1\*.RTF"  и  For each File In Files?
Как мне помнится VBS не различает регистр букв в переменных, соответственно проверяется наличие текущего файла из коллекции, а не соответствие его маске.
Называй вещи своими именами, например так: mask_file= "O:\instr\1\*.RTF"

Что делает данная строка FSO.FileExists(file)? Не уверен, что допустимо использовать маску файлов, а не конкретный файл. Если все таки пройдет использование маски, тогда вовсе не нужно проверять каждый файл на соответствие маске достаточно написать так:

Dim FSO,FileName                                              'Объявляем переменные
Set FSO = WScript.CreateObject("Scripting.FileSystemObject") 'Создаем объект FileSystemObject
set WshShell = CreateObject("WScript.Shell") 
iDir = "O:\instr\1\"                                     'Директория где проверяем наличие файла
mask_file = "O:\instr\1\*.RTF"                             'Маска файлов

i=0 
do while i = 0
WshShell.Sleep 5000                                         'Сколько ждать? (1000=1секунда)
if  FSO.FileExists(mask_file)  Then 
  MsgBox ("Пришел файл!")                                     
end if
loop

Собственно зачем весь сыр-бор? Только  для того, что бы уведомить пользователя о приходе файла?

3

Re: VBS проверка существования файла по маске

Fedor пишет:

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

Совершенно верно.

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

Если необходимо делать поиск по маске (*.RTF), то надо преобразовать маску в регулярное выражение. Возможно существуют простые средства в VBS по преобразованию маски в правильное регулярное выражение, но оно мне не знакомо. Поэтому я предлагаю использовать следующую функцию:


' функция преобразования шаблонов DOS вида *.RTF
' в правильное регистро-независимое регулярное выражение вида .*\.RTF
function pattern2regexp(pattern)
	dim re
	set re = new RegExp
	re.Pattern = "([\(\)\{\}\[\]\|\\\/\.\^\$])"
	re.Global = True

	pattern = re.Replace(pattern, "\$1")
	pattern = Replace(pattern, "*", ".*")
	pattern = Replace(pattern, "?", ".")

	set re = new RegExp
	re.Pattern = pattern
	re.IgnoreCase = true

	set pattern2regexp = re
end function

В дальнейшем результат функции можно использовать для поиска определенных файлов, соответствующих заданному шаблону:


pattern = "*.RTF"
set re = pattern2regexp(pattern)
...
if re.Test(filename) then
	WScript.Echo "File exists: " & filename
end if
( 2 * b ) || ! ( 2 * b )

4

Re: VBS проверка существования файла по маске

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

strPath = "D:\Temp"
Set objFolderItems = CreateObject("Shell.Application").NameSpace(strPath).Items
objFolderItems.Filter 64 + 128, "*.iso"
MsgBox "Кол-во элементов: " & objFolderItems.Count

Если задача решается с целью получения уведомления о появлении некоего файла в заданной папке, то для этого лучше использовать иной инструмент: WMI-подписку на соответствующее системное событие.
Ищите на форуме темы по ключам CIM_DirectoryContainsFile и __InstanceCreationEvent.

5 (изменено: xsanekk, 2012-09-10 18:09:33)

Re: VBS проверка существования файла по маске

Спасибо за ответы и скрипты! Они работают, но как сделать так что бы он сканировал каждые 5 минут на входящие файлы? Как сделать что бы скрипт начинал за ново работать с задержкой например 5 минут? Надо использовать Sleep Do loop? Или что то другое? Насколько я понял goto нет... или проще использовать планировщик виндовс?

6

Re: VBS проверка существования файла по маске

в виндузе для этого есть планировщик задач

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