Войти

Показать полную графическую версию : [решено] Проверка изменений папки, при обнаружении - архивирование/копирование.


Страниц : [1] 2

daniil98797
13-02-2013, 02:29
Собственно, сабж.
Нужен скрипт, проверяющий изменения папки. И при обнаружении архивирующий либо копирующий ее. Причем при каждом изменении, одно изменение = одна папка или архив.
Заранее спасибо!

daniil98797
13-02-2013, 03:25
Оказалось, что все решается очень просто. Создаем батник:
:again
xcopy Folder1 Folder2 /d
cscript //nologo delay.vbs 5000
goto:again
И файл delay.vbs с таким содержимым:
wscript.sleep wscript.arguments(0)
Получается скрипт, проверяющий изменения каждые пять секунд и копирующий только новые файлы.

Вот всегда так, полдня пытаешся что-то сделать, обращаешся за помощью на форум и сразу сам находишь решение. :)

dinovasya@vk
14-07-2014, 18:21
Усложним задачу.
Нужно чтоб при изменении данной папки, а именно создании в ней нового файла, на экране пользователя выходило сообщение: В папке создан новый файл с названием "......" Хотите открыть файл? и две кнопки ОК и Отмена ))) трудно так?

Iska
15-07-2014, 02:13
Не трудно.

Но если открывать файл нечем?

dinovasya@vk
19-07-2014, 15:06
Ну там уже виндовс берет на себя задачу чем открывать..
Главное чтобы диалоговое окно появлялось, а чем открыть- уж пользователю на выбор или программа по умолчанию.. А че- серьезно чтоль можно и так сделать?

Iska
19-07-2014, 18:47
Ну там уже виндовс берет на себя задачу чем открывать.. »
Не берёт.

а чем открыть- уж пользователю на выбор или программа по умолчанию.. »
Нет программы по умолчанию, нет — понимаете?

dinovasya@vk
19-07-2014, 20:00
http://www.white-windows.ru/wp-content/uploads/2014/06/3604501_01.jpg
то есть такое окно не откроется?

Ну а что тогда произойдет? давайте я попробую. чот куда вставить?

Iska
21-07-2014, 10:18
давайте я попробую. чот куда вставить? »
Пробуйте:
Option Explicit

Dim strSourceFolder

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemEventSource
Dim objSWbemObjectEx


strSourceFolder = "C:\Source"

strComputer = "."

Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

Set objSWbemEventSource = objSWbemServicesEx.ExecNotificationQuery( _
"SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
"TargetInstance ISA 'CIM_DirectoryContainsFile' AND " & _
"TargetInstance.GroupComponent = 'Win32_Directory.Name=""" & Replace(strSourceFolder, "\", "\\\\") & """'" _
)

Do
With objSWbemServicesEx.Get(objSWbemEventSource.NextEvent.TargetInstance.PartComponent)
If MsgBox("Хотите открыть файл?", vbQuestion & vbOKCancel, "Cоздан новый файл [" & .Name & "]") = vbOK Then
WScript.CreateObject("Shell.Application").ShellExecute .Name
End If
End With
Loop

WScript.Quit 0

dinovasya@vk
21-07-2014, 16:19
Вот что выходит



PS F:\Users\Admin> Option Explicit
Имя "Option" не распознано как имя командлета, функции, файла скрипта или выполняемой програм
написания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:7
+ Option <<<< Explicit
+ CategoryInfo : ObjectNotFound: (Option:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

PS F:\Users\Admin>
PS F:\Users\Admin> Dim strSourceFolder
Имя "Dim" не распознано как имя командлета, функции, файла скрипта или выполняемой программы.
писания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:4
+ Dim <<<< strSourceFolder
+ CategoryInfo : ObjectNotFound: (Dim:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

PS F:\Users\Admin>
PS F:\Users\Admin> Dim strComputer
Имя "Dim" не распознано как имя командлета, функции, файла скрипта или выполняемой программы.
писания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:4
+ Dim <<<< strComputer
+ CategoryInfo : ObjectNotFound: (Dim:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

PS F:\Users\Admin>
PS F:\Users\Admin> Dim objSWbemLocator
Имя "Dim" не распознано как имя командлета, функции, файла скрипта или выполняемой программы.
писания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:4
+ Dim <<<< objSWbemLocator
+ CategoryInfo : ObjectNotFound: (Dim:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

PS F:\Users\Admin> Dim objSWbemServicesEx
Имя "Dim" не распознано как имя командлета, функции, файла скрипта или выполняемой программы.
писания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:4
+ Dim <<<< objSWbemServicesEx
+ CategoryInfo : ObjectNotFound: (Dim:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

PS F:\Users\Admin> Dim objSWbemEventSource
Имя "Dim" не распознано как имя командлета, функции, файла скрипта или выполняемой программы.
писания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:4
+ Dim <<<< objSWbemEventSource
+ CategoryInfo : ObjectNotFound: (Dim:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

PS F:\Users\Admin> Dim objSWbemObjectEx
Имя "Dim" не распознано как имя командлета, функции, файла скрипта или выполняемой программы.
писания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:4
+ Dim <<<< objSWbemObjectEx
+ CategoryInfo : ObjectNotFound: (Dim:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

PS F:\Users\Admin>
PS F:\Users\Admin>
PS F:\Users\Admin> strSourceFolder = "\\server\open\test"
Имя "strSourceFolder" не распознано как имя командлета, функции, файла скрипта или выполняемо
вильность написания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:16
+ strSourceFolder <<<< = "\\server\open\test"
+ CategoryInfo : ObjectNotFound: (strSourceFolder:String) [], CommandNotFoundExc
+ FullyQualifiedErrorId : CommandNotFoundException

PS F:\Users\Admin>
PS F:\Users\Admin> strComputer = "."
Имя "strComputer" не распознано как имя командлета, функции, файла скрипта или выполняемой пр
ность написания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:12
+ strComputer <<<< = "."
+ CategoryInfo : ObjectNotFound: (strComputer:String) [], CommandNotFoundExcepti
+ FullyQualifiedErrorId : CommandNotFoundException

PS F:\Users\Admin>
PS F:\Users\Admin> Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator"
Set-Variable : Не удается найти позиционный параметр, принимающий аргумент "WScript.CreateObj
строка:1 знак:4
+ Set <<<< objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
+ CategoryInfo : InvalidArgument: (:) [Set-Variable], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SetVa

PS F:\Users\Admin> Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\
Имя "strComputer" не распознано как имя командлета, функции, файла скрипта или выполняемой пр
ность написания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:67
+ Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer <<<< , "root\cimv2")
+ CategoryInfo : ObjectNotFound: (strComputer:String) [], CommandNotFoundExcepti
+ FullyQualifiedErrorId : CommandNotFoundException

PS F:\Users\Admin>
PS F:\Users\Admin> Set objSWbemEventSource = objSWbemServicesEx.ExecNotificationQuery( _
>> "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
>> "TargetInstance ISA 'CIM_DirectoryContainsFile' AND " & _
>> "TargetInstance.GroupComponent = 'Win32_Directory.Name=""" & Replace(strSourceFolder,
>> )
>>
Отсутствует закрывающая ")" в выражении.
строка:2 знак:5
+ <<<< "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
+ CategoryInfo : ParserError: (CloseParenToken:TokenId) [], ParentContainsErrorR
+ FullyQualifiedErrorId : MissingEndParenthesisInExpression

PS F:\Users\Admin> Do
>> With objSWbemServicesEx.Get(objSWbemEventSource.NextEvent.TargetInstance.PartComponent
>> If MsgBox("Хотите открыть файл?", vbQuestion & vbOKCancel, "Cоздан новый файл [" &
>> WScript.CreateObject("Shell.Application").ShellExecute .Name
>> End If
>> End With
>> Loop
>>
Отсутствует тело инструкции в цикле do.
строка:2 знак:5
+ <<<< With objSWbemServicesEx.Get(objSWbemEventSource.NextEvent.TargetInstance.PartComp
+ CategoryInfo : ParserError: (do:String) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingLoopStatement

PS F:\Users\Admin> WScript.Quit 0

Iska
21-07-2014, 16:48
Вот что выходит
PS F:\Users\Admin> Option Explicit
Имя "Option" не распознано как имя командлета, функции, файла скрипта или выполняемой програм
написания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:7
+ Option <<<< Explicit »
Смотрим на заголовок темы:
VBS/WSH/JS - [решено] Проверка изменений папки, при обнаружении - архивирование/копирование. »
Выложенный мною код — WSH, на VBScript. Посему требуется его сохранить в файл с расширением «.vbs», указав вместо выделенного Вашу реальную папку, и запускать его, например, двойным щелчком из-под Проводника.

dinovasya@vk
21-07-2014, 18:30
спасибо.
Отлично работает, единственное что открывает 3 окна сразу.. создан новый файл, открыть файл..

dinovasya@vk
21-07-2014, 18:55
вот положил неизвестного типа файл. в итоге как обычно выскочило 3 окна - нажал открыть- виндовс взял на себя процесс открытия о чем я и говорил..

http://i60.tinypic.com/j7gbgl.png
заметил 3 недостатка:

1) открывается окно три раза а не один
2) вместо локального адреса пробовал указывать сетевой- не сработал скрипт. вместо D:\open\test писал \\server\open\test (это сетевой адрес папки)- в итоге на другой машине не сработал скрипт.
3) если заменяю файл файлом с тем же именем, но другим содержанием скрипт молчит.

Но впринципе проверки на изменения небыло..

Iska
21-07-2014, 18:57
единственное что открывает 3 окна сразу.. »
Покажите все три окна на скриншоте.

1) открывается окно три раза а не один »
Поясните скриншотом.

2) вместо локального адреса пробовал указывать сетевой- не сработал скрипт. вместо D:\open\test писал \\server\open\test (это сетевой адрес папки)- в итоге на другой машине не сработал скрипт. »
Это не «на другой машине». На другой — это вместо:
strComputer = "."
указываете её имя или адрес.

На сетевом ресурсе «\\server\open\test» работать не будет по той причине, что данный путь отсутствует в пространстве имён Wbem. Если подключите сетевой ресурс как диск — можете опробовать.

3) если заменяю файл файлом с тем же именем, но другим содержанием скрипт молчит. »
Естественно. Это не:
создании в ней нового файла »
а изменение существующего.

dinovasya@vk
21-07-2014, 19:16
http://i61.tinypic.com/16c7t49.png
как только создаешь файл, сразу же появляются эти 3 окна с периодичностью примерно 2 секунды

можно ли чтоб проверяло скажем так 1 раз в минуту ?

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

dinovasya@vk
21-07-2014, 20:38
данный путь отсутствует в пространстве имён Wbem »
Как добавить сервер в пространство имен?

1) открывается окно три раза а не один »

Хах!! 3 раза скрипт был запущен!
работает идеально при подключении сетевого диска.

Iska
22-07-2014, 04:07
как только создаешь файл, сразу же появляются эти 3 окна с периодичностью примерно 2 секунды »
Вы верно заметили, что это именно:
Хах!! 3 раза скрипт был запущен! »

можно ли чтоб проверяло скажем так 1 раз в минуту ? »
Можно. Измените периодичность опроса в запросе с «WITHIN 5» на «WITHIN 60».

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

strSourceFolder = "Local path for remote machine"

strComputer = "RemoteMachineName"


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

dinovasya@vk
22-07-2014, 11:07
нет, не получается, пробовал и ip компа и его имя и его порлное доменное имя- все сводится к этой ошибке при запуске скрипта
http://s21.postimg.org/55nn1rl3r/script_setka.jpg

Iska
22-07-2014, 13:12
Connecting to WMI on a Remote Computer (Windows) (http://msdn.microsoft.com/en-us/library/aa389290(v=vs.85).aspx)

dinovasya@vk
22-07-2014, 14:27
strComputer = "server"
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer _
(strComputer, "root\cimv2", "domen\administrator", "password")
objSWbemServices.Security_.ImpersonationLevel = 3

Iska
22-07-2014, 21:38
strComputer = "server"
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer _
(strComputer, "root\cimv2", "domen\administrator", "password")
objSWbemServices.Security_.ImpersonationLevel = 3 »
Сие что должно означать?




© OSzone.net 2001-2012