Centrum skryptów - Systemy operacyjne

Co zrobić, aby skrypt działał tylko w pierwszy lub drugi poniedziałek miesiąca?

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.

Co zrobić, aby skrypt działał tylko w pierwszy lub drugi poniedziałek miesiąca?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! ! Mamy skrypt logowania, który ma wykonywać pewne zadania tylko w pierwszy i drugi poniedziałek miesiąca. Jak można określić, czy skrypt jest uruchomiony w pierwszy lub w drugi poniedziałek miesiąca?

-- WA

Cześć Skrypciarze! Odpowiedź

Cześć, WA. Skrypciarzowi piszącemu te słowa co chwilę przydarzają się jakieś dziwne historie. Ostatnio niechcący wrzucił swój zegarek do garnka z gotującą wodą. Jakie to szczęście, że zegarek nie był z tych strasznie drogich. No tak, każdemu czasem może coś nie wyjść, albo wpaść. Niektórym, jak w przypadku naszego Skrypciarze, zdarza się to po prostu częściej niż innym. Chociaż to zdarzenie nie ma nic wspólnego ze skryptem, o który pytacie, teraz przynajmniej wiecie z kim macie do czynienia.

Nie ma się czego obawiać, bo jeżeli chodzi o pisanie skryptów, naszemu Skrypciarzowi nie zdarzają się żadne wpadki. Oto skrypt, który określi, czy działa w pierwszy, czy w drugi poniedziałek miesiąca:

Dim arrMondays(1)



dtmMonth = Month(Date)

dtmYear = Year(Date)

dtmDate = CDate(dtmMonth & "/1" & "/" & dtmYear)



Do Until i = 1

    intWeekDay = Weekday(dtmDate)

    If intWeekDay = 2 Then

        arrMondays(0) = dtmDate

        arrMondays(1) = dtmDate + 7

        Exit Do

    End If

    dtmDate = dtmDate + 1

Loop



For Each strMonday in arrMondays

    If Date = strMonday Then

        Wscript.Echo "Carry out the task."

    Else

        Wscript.Echo "Don't carry out the task."

    End If

Next

Zatem jak on działa? Zawsze zadajecie to pytanie.

No cóż, zobaczmy. Zaczynamy od określenia tablicy o nazwie arrMondays i zwiększamy jej rozmiar tak, aby zawierała dwa elementy:

Dim arrMondays(1)

Ale dlaczego dwa elementy? Ponieważ chcemy określić datę pierwszych dwóch poniedziałków w miesiącu. Dwa poniedziałki, dwa okienka w tablicy.

Następnie używamy poniższego fragmentu kodu, aby utworzyć datę pierwszego dnia bieżącego miesiąca:

dtmMonth = Month(Date)

dtmYear = Year(Date)

dtmDate = CDate(dtmMonth & "/1" & "/" & dtmYear)

Jak widać, w pierwszych dwóch wierszach kodu używamy funkcji Month, aby określić bieżący miesiąc, następnie używamy funkcji Year, aby określić bieżący rok. W trzecim wierszu łączymy razem dwie wartości, numer 1 oraz kilka znaków „/”, aby utworzyć następującą datę (w formacie MM/DD/RRRR):

2/1/2007

Dobre pytanie: do czego służy funkcja CDate w poprzednim wierszu kodu? Cóż, nazwa funkcji CDate to skrót od „character-to-date”, ma ona za zadanie przekonwertować ciąg znaków na datę. Umieszczamy ją tutaj, aby mieć pewność, że wartość 2/1/2007 zostanie potraktowana jako data, a nie jako ciąg znaków.

Kolejne dobre pytanie: Dlaczego w ogóle zajmujemy się pierwszym dniem miesiąca? No cóż, nie mamy pojęcia, kiedy przypadają pierwszy ani drugi poniedziałek w miesiącu, a na dodatek, nie znamy sposobu na określenie takiej prawidłowości. Dlatego też zaczynamy od pierwszego dnia w miesiącu i sprawdzamy, czy nie jest to poniedziałek. Następnie sprawdzamy, czy drugi dzień miesiąca jest poniedziałkiem. Jeżeli nie, sprawdzamy trzeci dzień miesiąca… i tak dzień po dniu, aż do momentu, w którym znajdziemy pierwszy poniedziałek. Kiedy już mamy datę pierwszego poniedziałku, dodajemy do niej siedem dni i otrzymujemy datę drugiego poniedziałku.

Uwaga. Jeżeli chcemy uruchamiać skrypt w pierwszy i trzeci poniedziałek miesiąca, w takim wypadku dodajemy czternaście dni do daty pierwszego poniedziałku.

Poniższego kodu używamy, aby określić daty dwóch pierwszych poniedziałków:

Do Until i = 1

    intWeekDay = Weekday(dtmDate)

    If intWeekDay = 2 Then

        arrMondays(0) = dtmDate

        arrMondays(1) = dtmDate + 7

        Exit Do

    End If

    dtmDate = dtmDate + 1

Loop

Utworzyliśmy tutaj pętlę Do, która będzie działać, dopóki zmienna licznika i jest równa zero, w wyniku czego pętla będzie działać, dopóki jej nie przerwiemy jej działania. (Dlaczego? Ponieważ biorąc pod uwagę sposób, w jak skonstruowany jest skrypt, wartość i nigdy nie będzie równa zero.) Wewnątrz tej pętli używamy funkcji Weekday, aby określić, który dzień tygodnia jest pierwszym dniem miesiąca.

intWeekDay = Weekday(dtmDate)

Funkcja Weekday pozwala nam uzyskać liczbę całkowitą dla dni tygodnia: 1 dla niedzieli, 2 dla poniedziałku, 3 dla wtorku, itd.. Z uwagi na to, że nas interesują tylko poniedziałki, sprawdzamy, czy wartość intWeekDay jest równa 2. Przypuśćmy, że nie jest. W takim wypadku dodajemy jeden dzień do wartości daty dtmDate, uruchamiamy pętlę i w ten sam sposób sprawdzamy drugi dzień tygodnia:

dtmDate = dtmDate + 1

Co się dzieje, kiedy już znajdziemy poniedziałek? Otóż przypisujemy wartość dtmDate do pierwszego elementu w tablicy, następnie dodajemy do tej wartości siedem dni i przypisujemy uzyskaną datę do drugiego elementu w tablicy:

arrMondays(0) = dtmDate

arrMondays(1) = dtmDate + 7

Stosujemy teraz instrukcję Exit Do i przerywamy działanie pętli.

Na koniec, uruchamiamy pętlę przechodzącą przez obydwie daty z tablicy i sprawdzamy, czy któraś z nich nie jest przypadkiem datą bieżącą. Jeżeli jest, wynika z tego, że skrypt jest uruchomiony w pierwszy lub drugi poniedziałek miesiąca. Jeżeli to faktycznie jest pierwszy lub drugi poniedziałek miesiąca, stosujemy określony fragment kodu. W naszym przykładowym skrypcie, po prostu wyświetlamy echo informacji o tym, czy powinniśmy (lub nie powinniśmy) wykonać ustalone zadanie:

For Each strMonday in arrMondays

    If strMonday = Date Then

        Wscript.Echo "Carry out the task."

    Else

        Wscript.Echo "Don't carry out the task."

    End If

Next

I to by było tyle na ten temat.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne