Centrum skryptów - Systemy operacyjne

Jak automatycznie otwierać nowe pliki dodane do folderu?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak automatycznie otwierać nowe pliki dodane do folderu?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak automatycznie otwierać nowe pliki dodane do folderu?

-- CA

Cześć Skrypciarze! Odpowiedź

Cześć, CA. Wiecie, że Walentynki to taki dzień, o którym prawie każdy facet zapomina, a w którym powinien obsypać swoją ukochaną osobę prezentami, jako sposób na podziękowanie jej za te wszystkie dobroci, które go spotykają z jej strony.

Odnośnie Walentynek, istnieje pewna legenda mówiąca o tym, że w trzecim wieku Cesarz Rzymski zakazał młodym mężczyznom się żenić, gdyż był przekonany, że będą z nich lepsi żołnierze. (Dzisiaj większość mędrców się z tym nie zgadza, twierdząc, że nikt nie ma lepszego doświadczenia w walce niż żonaty mężczyzna). Według tej legendy, Św. Walenty był księdzem, który w tajemnicy udzielał ślubów. Kiedy go złapano, zamęczono go na śmierć.

W każdym razie, jeżeli dalej zastanawiacie się nad walentynkowym prezentem, mam dla was rozwiązanie. Skrypt, który przegląda folder wyszukując nowe pliki, a następnie otwiera wszystkie te, które zostały dodane do tego folderu:

Set objShell = CreateObject("Wscript.Shell")



strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & 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

    strNewFile = objLatestEvent.TargetInstance.PartComponent

    arrNewFile = Split(strNewFile, "=")

    strFileName = arrNewFile(1)

    strFileName = Replace(strFileName, "\\", "\")

    strFileName = Replace(strFileName, Chr(34), "")

    objShell.Run("notepad.exe " & strFileName)

Loop

I wcale nie są wam potrzebne okulary. Ten skrypt naprawdę tak wygląda. Może coś wam to pomoże, jeżeli wytłumaczę dlaczego wygląda tak, a nie inaczej.

Rozpoczynamy w prosty sposób, tworząc wystąpienie obiektu Wscript.Shell, który będziemy wykorzystywać do otwierania pliku. Następnie zrobimy coś równie nieskomplikowanego – podłączymy się do usługi WMI na lokalnym komputerze. (Jak zwykle zresztą, ten skrypt może być również używany dla zdalnych komputerów i będzie tak samo efektywny.)

Napotykamy taki oto wiersz kodu:

Set colMonitoredEvents = objWMIService.ExecNotificationQuery _

    ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _

        & "TargetInstance ISA 'CIM_DirectoryContainsFile' and " _

            & "TargetInstance.GroupComponent= " _

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

Nie będziemy teraz szczegółowo opisywać tego monstrum, jeśli chcecie wiedzieć więcej – zerknijcie na webcast Skrypciarzy An Ounce Of Prevention (j.ang.). Krótko mówiąc, ta kwerenda jest tak ustawiona, że co 10 sekund sprawdza, czy do folderu C:\Scripts nie zostały dodane nowe pliki. Jak natomiast można sprawdzić, czy kwerenda wyszukuje nowe pliki? Cóż, wiemy, że tak jest, ponieważ wysyła zapytanie o przykłady klasy __InstanceCreationEvent. Wiemy także, że poszukujemy plików, ponieważ określamy, iż interesują nas tylko nowe elementy tej klasy, należące też do klasy CIMDirectoryContainsFile.

To jeszcze nie wszystko. Za pomocą klauzuli WITHIN 10 można dostosować długość przerwy pomiędzy kwerendami, jeżeli 10 sekund to wartość zbyt długa lub zbyt krótka. Na koniec, wiemy, że mamy do czynienia z folderem C:\Scripts dzięki temu wierszowi:

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

Wszystkie znaczki „\”, jak również cudzysłowy i apostrofy są wymagane.

Rozumiecie coś z tego? Szczerze mówiąc, my też nie. Jeżeli jednak zastosujecie powyższy przykład jako szablon, zmieniając tylko te pozycje (na przykład nazwę folderu), które chcecie zmienić, powinno być OK.

Bardzo chcielibyśmy wam powiedzieć, że całe to szaleństwo mamy już za sobą, ale to niestety niemożliwe. Kolejnym krokiem jest uruchomienie pętli Do, która będzie działać bez końca; być może zauważycie, że nie ma żadnych kryteriów końcowych typu „Do Until x = 1” czy „Do While x < 10”:

Do

Kiedy już jesteśmy wewnątrz pętli, naszym pierwszym krokiem jest wydanie komendy, która spowoduje „zablokowanie” skryptu. Oznacza to po prostu, że skrypt zatrzyma się na tym wierszu kodu dopóki nasza kwerenda nie powiadomi nas, że zaszło pożądane zdarzenie:

Set objLatestEvent = colMonitoredEvents.NextEvent

Nie muszę chyba dodawać, że dzięki kryteriom określonym w naszej kwerendzie, takie powiadomienie może oznaczać tylko jedno: że do folderu C:\Scripts został dodany nowy plik.

I znowu powraca do nas to dziwactwo. Za każdym razem, kiedy do folderu zostaje dodany nowy plik, otrzymujemy powiadomienie, a oprócz tego możemy zerknąć na właściwości PartComponent, aby określić ścieżkę dostępu:

strNewFile = objLatestEvent.TargetInstance.PartComponent

To jest dobra wiadomość. Zła wiadomość jest taka, że PartComponent wygląda tak:

\\ATL-WS-01\root\cimv2:CIM_DataFile.Name="c:\\scripts\\New Text Document.txt"

Blee… Jednak nie rozpaczajmy zawczasu, możemy wydobyć z tego wiersza ścieżkę dostępu. Gwarantuję.

Aby to zrobić, najpierw używamy funkcji Split, aby rozdzielić PartComponent w miejscu, gdzie znajduje się znak równości. Otrzymamy wtedy tablicę zawierającą dwie pozycje:

  • \\ATL-WS-01\root\cimv2:CIM_DataFile.Name"
  • "c:\\scripts\\New Text Document.txt"

Jak widać, ścieżka której potrzebujemy jest zawarta w drugiej pozycji tablicy. (Która, biorąc pod uwagę charakter tablic, ma przypisany numer porządkowy 1.) Mając to na uwadze, za pomocą poniższego wiersza kodu używamy tego elementu jako wartości zmiennej strFileName:

strFileName = arrNewFile(1)

Teraz musimy tylko uporządkować pewne informacje. Najpierw używamy funkcji Replace, aby zastąpić wszystkie podwójne znaki „\” znakami pojedynczymi, w sposób następujący:

strFileName = Replace(strFileName, "\\", "\")

Dzięki temu otrzymujemy zmienną strNewFile równą: "c:\scripts\New Text Document.txt". I to właśnie jest nasza ścieżka dostępu. Lub przynajmniej będzie, kiedy zastosujemy funkcję Replace, aby usunąć podwójne cudzysłowy (które posiadają wartość ASCII równą 34):

strFileName = Replace(strFileName, Chr(34), "")

Teraz, kiedy już zmienna strFileName zawiera prawdziwą ścieżkę dostępu do nowego pliku, możemy użyć metody Run i otworzyć ten nowy plik w Notatniku:

objShell.Run("notepad.exe " & strFileName)

Dobre pytanie: czy koniecznie trzeba otwierać nowe pliki w notatniku? Nie, jednakże należy określić plik wykonywalny, nie możemy tak po prostu użyć metody Run w celu bezpośredniego otwarcia pliku C:\Scripts\New Text Document.txt. Zastosowaliśmy tutaj łatwiejszy sposób i założyliśmy, że wszystkie nowe pliki, które mogą zostać dodane do folderu C:\Scripts, mogą zostać otwarte za pomocą Notatnika. Jeżeli tak nie jest, należy dodać dodatkowy kod do skryptu, który sprawdzi rozszerzenie pliku, a następnie uruchomi odpowiednią aplikację (np. uruchomi program Excel, jeżeli plik będzie w formacie .xls). Najprawdopodobniej sami dacie radę to rozszyfrować. Jeżeli nie, opiszemy to w przyszłości.

Przy odrobinie szczęścia CA, nie tylko jest to odpowiedź na Twoje pytanie, ale i rozwiązanie sprawy prezentu walentynkowego. Jeżeli nie, jako prezent dla drugiej połówki sugerujemy laleczkę doktora Scripto (j.ang.). No tak, nie możecie właściwie jej zakupić, jednak jest jeszcze szansa, aby ją wygrać w Olimpiadzie Skrypciarskiej 2007 (j.ang.). Trzeba tylko zapisać się do którejś z konkurencji i wygrać losowanie jednej z 250 laleczek.

W sumie to nie jest duży prezent, ale czy można przejść obojętnie obok takiego przystojniaka?:

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne