Centrum Skryptów - Systemy Operacyjne

Czy można włączyć automatyczne uruchamianie skryptu przy każdym dodaniu jakiegoś pliku do folderu? Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w nowej rubryce TechNet’u, w której Skrypciarze odpowiadają na najczęściej zadawane pytania dotyczące używania skryptów podczas administrowania systemami. Jeśli masz jakieś pytania dotyczące tego tematu, nie wahaj zwrócić się z nimi do nas. Napisz na adres scripter@microsoft.com (w jęz. angielskim). Nie możemy obiecać, że odpowiemy na wszystkie pytania. Z pewnością jednak zrobimy wszystko, co w naszej mocy, żeby pomóc Ci w rozwiązaniu problemu.

Czy można włączyć automatyczne uruchamianie skryptu przy każdym dodaniu jakiegoś pliku do folderu?

Cześć Skrypciarze! Pytanie

Cześć Skrypciarze! Czy możliwe jest wprowadzenie takich ustawień, które będą automatycznie uruchamiać skrypt za każdym razem, gdy do danego folderu dodawany jest jakiś skrypt?

-- MB

Cześć Skrypciarze! Odpowiedź

Cześć MB. Owszem, jest to możliwe dzięki czarodziejskim sztuczkom ze zdarzeniami WMI. Dzięki nim, możesz napisać skrypt monitorujący czy nie zachodzi jakieś zdarzenie (jak na przykład dodanie pliku do folderu) i podejmujący w takim wypadku odpowiednie działanie. Nie mamy miejsca, by szczegółowo omawiać tu zdarzenia WMI, ale zapewniamy, że jest to narzędzie nadzwyczaj wygodne dla osób zajmujących się pisaniem skryptów.

A tymczasem przedstawiamy skrypt monitorujący folder C:\Scripts. Każde dodanie dowolnego pliku do tego folderu spowoduje, że skrypt wyświetli nazwę tego pliku:

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _

    & "{impersonationLevel=impersonate}!\\" & _

        strComputer & "\root\cimv2")

Set colMonitoredEvents = objWMIService.ExecNotificationQuery _

    ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _

        & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _

            & "TargetInstance.GroupComponent= " _

                & "'Win32_Directory.Name=""c:\\\\scripts""'")

Do

    Set objLatestEvent = colMonitoredEvents.NextEvent

    Wscript.Echo objLatestEvent.TargetInstance.PartComponent

Loop

Znów nie ma miejsca, by opisać każdy z elementów tego skryptu, ale chodzi nam głównie o wystąpienia elementów klasy __InstanceCreationEvent; powstają one za każdym razem, gdy na komputerze tworzony jest nowy obiekt zarządzany (czyli coś, o czym wie WMI). Zapytanie jest wprawdzie trochę skomplikowane, ale chodzi w nim tylko o to, by informować nas o nowych elementach pojawiających się w folderze C:\Scripts. (Zwróć uwagę że fragment C:\\\\Scripts to nie literówka; naprawdę potrzebne są cztery ukośniki.)

Warto zaznaczyć jeszcze, że skrypty WMI tego rodzaju działają z użyciem "pollingu”, tzn. w regularnych odstępach czasu sprawdza, czy w folderze pojawiły się nowe pliki. W przykładowym skrypcie sprawdzanie odbywa się co dziesięć sekund (stąd fragment WITHIN 10). Wartość tę można dowolnie zmieniać, pamiętając jednak, że zbyt częste sprawdzanie (np. co sekundę) spowoduje, że skrypt będzie cały czas uruchomiony, spowalniając system. Sprawdzanie zbyt rzadkie może z kolei spowodować, że pominięte zostanie pojawienie się nowych plików, jeśli zostaną one skasowane w okresie między sprawdzeniami. Załóżmy na przykład, ze skrypt sprawdza czy nie pojawiły się nowe pliki co pięć minut. W ten sposób będziesz mógł dodać 100 plików i usunąć je po trzech minutach, a skrypt tego w ogóle nie zauważy. Dzieje się tak dlatego, że skrypt porównuje obecną zawartość folderu z zawartością w momencie ostatniego sprawdzania. Wypróbuj kilka ustawień i zobacz, które będzie Ci najbardziej odpowiadać.

Jak napisaliśmy powyżej, podany skrypt spowoduje jedynie wyświetlenie nazwy nowego pliku dodanego do folderu C:\Scripts. A co by było, gdybyśmy chcieli spowodować jakąś fajniejszą reakcję na dodanie pliku? Żaden problem. Wystarczy zamienić poniższy wiersz kodem odpowiednim do pożądanej reakcji:

Wscript.Echo objLatestEvent.TargetInstance.PartComponent

A przy okazji: może chciałbyś być powiadamiany o usunięciu pliku z folderu C:\Scripts? To bardzo łatwe: wystarczy monitorować, czy w folderze C:\Scripts nie wystąpi element klasy __InstanceDeletionEvent:

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _

    & "{impersonationLevel=impersonate}!\\" & _

        strComputer & "\root\cimv2")

Set colMonitoredEvents = objWMIService.ExecNotificationQuery _

    ("SELECT * FROM __InstanceDeletionEvent WITHIN 10 WHERE " _

        & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _

            & "TargetInstance.GroupComponent= " _

                & "'Win32_Directory.Name=""c:\\\\scripts""'")

Do

    Set objLatestEvent = colMonitoredEvents.NextEvent

    Wscript.Echo objLatestEvent.TargetInstance.PartComponent

Loop

No, przecież mówiliśmy, że zdarzenia WMI to dobra rzecz!

 

 Do początku strony Do początku strony


Centrum Skryptów - Systemy Operacyjne