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

daniil98797 13-02-2013 02:29 2089203

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

daniil98797 13-02-2013 03:25 2089218

Оказалось, что все решается очень просто. Создаем батник:
Код:

: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 2376417

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

Iska 15-07-2014 02:13 2376594

Не трудно.

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

dinovasya@vk 19-07-2014 15:06 2378410

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

Iska 19-07-2014 18:47 2378523

Цитата:

Цитата dinovasya@vk
Ну там уже виндовс берет на себя задачу чем открывать.. »

Не берёт.

Цитата:

Цитата dinovasya@vk
а чем открыть- уж пользователю на выбор или программа по умолчанию.. »

Нет программы по умолчанию, нет — понимаете?

dinovasya@vk 19-07-2014 20:00 2378554


то есть такое окно не откроется?

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

Iska 21-07-2014 10:18 2379182

Цитата:

Цитата dinovasya@vk
давайте я попробую. чот куда вставить? »

Пробуйте:
читать дальше »
Код:

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 2379352

Вот что выходит



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 2379363

Цитата:

Цитата dinovasya@vk
Вот что выходит
PS F:\Users\Admin> Option Explicit
Имя "Option" не распознано как имя командлета, функции, файла скрипта или выполняемой програм
написания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:7
+ Option <<<< Explicit »

Смотрим на заголовок темы:
Цитата:

Цитата daniil98797
VBS/WSH/JS - [решено] Проверка изменений папки, при обнаружении - архивирование/копирование. »

Выложенный мною код — WSH, на VBScript. Посему требуется его сохранить в файл с расширением «.vbs», указав вместо выделенного Вашу реальную папку, и запускать его, например, двойным щелчком из-под Проводника.

dinovasya@vk 21-07-2014 18:30 2379427

спасибо.
Отлично работает, единственное что открывает 3 окна сразу.. создан новый файл, открыть файл..

dinovasya@vk 21-07-2014 18:55 2379434

вот положил неизвестного типа файл. в итоге как обычно выскочило 3 окна - нажал открыть- виндовс взял на себя процесс открытия о чем я и говорил..


заметил 3 недостатка:

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

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

Iska 21-07-2014 18:57 2379435

Цитата:

Цитата dinovasya@vk
единственное что открывает 3 окна сразу.. »

Покажите все три окна на скриншоте.

Цитата:

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

Поясните скриншотом.

Цитата:

Цитата dinovasya@vk
2) вместо локального адреса пробовал указывать сетевой- не сработал скрипт. вместо D:\open\test писал \\server\open\test (это сетевой адрес папки)- в итоге на другой машине не сработал скрипт. »

Это не «на другой машине». На другой — это вместо:
Код:

strComputer = "."
указываете её имя или адрес.

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

Цитата:

Цитата dinovasya@vk
3) если заменяю файл файлом с тем же именем, но другим содержанием скрипт молчит. »

Естественно. Это не:
Цитата:

Цитата dinovasya@vk
создании в ней нового файла »

а изменение существующего.

dinovasya@vk 21-07-2014 19:16 2379442


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

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

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

dinovasya@vk 21-07-2014 20:38 2379471

Цитата:

Цитата Iska
данный путь отсутствует в пространстве имён Wbem »

Как добавить сервер в пространство имен?

Цитата:

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

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

Iska 22-07-2014 04:07 2379574

Цитата:

Цитата dinovasya@vk
как только создаешь файл, сразу же появляются эти 3 окна с периодичностью примерно 2 секунды »

Вы верно заметили, что это именно:
Цитата:

Цитата dinovasya@vk
Хах!! 3 раза скрипт был запущен! »

Цитата:

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

Можно. Измените периодичность опроса в запросе с «WITHIN 5» на «WITHIN 60».

Цитата:

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

Если у Вас есть права — можете проверять непосредственно на удалённой машине в локальной для неё папке:
Код:


strSourceFolder = "Local path for remote machine"

strComputer = "RemoteMachineName"

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

dinovasya@vk 22-07-2014 11:07 2379631

нет, не получается, пробовал и ip компа и его имя и его порлное доменное имя- все сводится к этой ошибке при запуске скрипта

Iska 22-07-2014 13:12 2379682

Connecting to WMI on a Remote Computer (Windows)

dinovasya@vk 22-07-2014 14:27 2379731

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 2379966

Цитата:

Цитата dinovasya@vk
strComputer = "server"
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer _
(strComputer, "root\cimv2", "domen\administrator", "password")
objSWbemServices.Security_.ImpersonationLevel = 3 »

Сие что должно означать?

dinovasya@vk 22-07-2014 23:28 2380018

Да ниче не получилось, доступ отказан, то сервис rpc недоступен..
короче вставлял эти строки в скрипт, изменяя на данные админа. Нет прав говорит, хотя права точно есть- к удаленному рабочему столу подключаюсь же.. короче на досуге повожусь еще..

Iska 23-07-2014 00:05 2380030

dinovasya@vk, прочитайте перечень статей, доступных по ссылке из поста #18. Там достаточно подробно описано, как разрешить удалённое управление на машине, как его включить и настроить, как следует сконфигурировать фаерволл и т.п.

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

dinovasya@vk 24-07-2014 11:56 2380665

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

Iska 24-07-2014 12:43 2380685

dinovasya@vk, к сожалению, действительно не понимаете. Wbem и SMB — это разные технологии. Мне добавить к уже изложенному выше нечего.

Используйте в таком случае подключения дисков к сетевым ресурсам и отслеживайте изменения на них.

Цитата:

Цитата dinovasya@vk
Можно явно прописать в скрипте чтоб использовало уже существующие права пользователя, который залогинился уже на данном компьютере в доменной сети? »

Явно как раз не надо «прописывать». Ибо так и есть по умолчанию. Я писал об этом постом ранее. У меня именно так и работает.

dinovasya@vk 24-07-2014 12:49 2380687

Цитата:

Цитата Iska
к сожалению, действительно не понимаете. Wbem и SMB — это разные технологии. »

Да, надо пополнять копилку знаний. Чем больше знаю- тем больше не знаю.. буду читать, что уж тут говорить.
Спасибо за всё!


Время: 01:43.

Время: 01:43.
© OSzone.net 2001-