Centrum skryptów - Systemy operacyjne

Jak codziennie zmieniać nazwę pliku używając bieżącej daty jako części nazwy pliku?

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 codziennie zmieniać nazwę pliku używając bieżącej daty jako części nazwy pliku?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Mam plik o nazwie BackupFile-06122007.txt, w którym 06122007 reprezentuje wczorajszą datę (12 czerwca 2007). Potrzebuję skryptu, który uruchamiany każdego ranka zmienia nazwę tego pliku z zastosowaniem dzisiejszej daty: BackupFile-06132007.txt. Jak to zrobić?

-- GZ

Cześć Skrypciarze! Odpowiedź

Cześć, GZ. Czasem spotykamy na swojej drodze ludzi, którzy postępują według jakichś określonych (ściśle zresztą) zasad, bez żadnego negowania czegokolwiek, dlatego, że jakaś odgórna, że tak to ujmiemy, „władza” takie zasady ustaliła. To może być piękne: myślimy sobie, że godnym podziwu jest, gdy ludzie konsekwentnie idą obraną drogą, czasem zastanawiamy się, czy nie wejść na tę drogę i wtedy często przychodzi rozczarowanie. Kiedy zaczynamy rozmowę z tymi ludźmi chcąc dowiedzieć się więcej, okazuje się, że nie są oni w sposób przekonujący umotywować swojego stanowiska i chociaż bardzo chcieliby nas przekonać, że ich droga jest drogą właściwą, wychodzi na jaw, że tak naprawdę nie wiedzą dlaczego.

Nie wiem, czy to jest jasne dla wszystkich, ale mam nadzieję, że chociaż odrobinę. Gdyby jednak nie było, no cóż, nie tym będziemy zaskoczeni, ponieważ piszący te słowa Skrypciarz sam do końca nie wie, jak ma wyrazić to, co mu na duszy leży. Dobrze chociaż, że nie ma żadnych wątpliwości odnośnie tego, jak powinien wyglądać skrypt zmieniający nazwę pliku z zastosowaniem bieżącej daty w nazwie:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



strMonth = Month(Date - 1)



If Len(strMonth) = 1 Then

    strMonth = "0" & strMonth

End If



strDay = Day(Date - 1)



If Len(strDay) = 1 Then

    strDay = "0" & strDay

End If



strYear = Year(Date - 1)



strFileName = "C:\\Test\\BackupFile-" & strMonth & strDay & strYear  & ".txt"



Set colFiles = objWMIService.ExecQuery _

    ("Select * From CIM_DataFile Where Name = '" & strFileName & "'")



For Each objFile in colFiles



    strMonth = Month(Date)



    If Len(strMonth) = 1 Then

        strMonth = "0" & strMonth

    End If



    strDay = Day(Date)



    If Len(strDay) = 1 Then

        strDay = "0" & strDay

    End If



    strYear = Year(Date)



    strNewFileName = "C:\\Test\\BackupFile-" & strMonth & strDay & strYear  & ".txt"



    errResult = objFile.Rename(strNewFileName)

Next

Mamy nadzieję, że dacie radę odczytać ten kod skryptu. Ale przecież nie chcemy nikogo straszyć. Jak widać na pierwszy rzut oka, ten skrypt jest może trochę bardziej skomplikowany niż można było się spodziewać. Dlaczego? No cóż, zanim zmienimy nazwę pliku, musimy się z nim połączyć za pomocą skryptu; żeby to zrobić, potrzebujemy kompletnej ścieżki dostępu. A to stanowi pewien problem: w końcu chodzi o to, żeby plik miał codziennie inną nazwę. (Na przykład, jeżeli dzisiaj plik ma nazwę BackupFile-06122007.txt, jutro będzie miał BackupFile-06132007.txt i tak dalej.) Dlatego też musimy zrobić dwie rzeczy: znaleźć bieżącą nazwę, a następnie ją zmienić.

Nie wygląda to na łatwe zadanie, nieprawdaż? Jednak z uwagi na fakt, że potrzebujemy skryptu uruchamianego codziennie, okazuje się, że będzie to porażająco proste.

Pokażemy teraz, co rozumiemy przez „przerażająco prosty”. Nasz skrypt rozpoczyna się połączeniem z usługą WMI na lokalnym komputerze (ale plik zadziała równie dobrze w przypadku pliku zachowanego na zdalnym komputerze). To jest moment, w którym normalnie połączylibyśmy się z naszym plikiem. Więc dlaczego nie możemy tego zrobić teraz? To proste: nie wiemy, z którym plikiem mamy się połączyć. Dlatego też, zanim zrobimy cokolwiek innego, musimy znaleźć nazwę naszego docelowego pliku. A ponieważ częścią tej ścieżki pliku (a zarazem częścią nazwy pliku) jest wczorajsza data, stosujemy poniższy fragment kodu:

strMonth = Month(Date - 1)



If Len(strMonth) = 1 Then

    strMonth = "0" & strMonth

End If



strDay = Day(Date - 1)



If Len(strDay) = 1 Then

    strDay = "0" & strDay

End If



strYear = Year(Date - 1)

Na czym to polega? No cóż, na początek, stosujemy funkcję Month w celu określenia miesiąca dla naszej wczorajszej daty; do tego służy Date – 1 (bieżąca data minus 1 dzień). Dzięki funkcji Month otrzymamy wartość liczby całkowitej reprezentującą miesiąc; na przykład funkcja ta podaje nam wartość 10, jeżeli chodzi o miesiąc październik, 12, jeżeli mamy grudzień, a 6, jeżeli chodzi o czerwiec.

Tak, macie racę: mamy problem. Załóżmy, że zastosowaliśmy następującą datę w nazwie pliku: 1112007. Czy to oznacza datę: 1/11/2007 czy 11/1/2007 (w formacie amerykańskim: MM/DD/RRRR)? Szczerze mówiąc, nie ma sposobu, żeby to określić. Dlatego też musimy się upewnić, że miesiące (oraz dni) są wymienione jako dwucyfrowe wartości; z zerem prowadzącym używanym z miesiącami o pojedynczej cyfrze. (Innymi słowy, modyfikujemy miesiąc czerwiec tak, żeby był reprezentowany przez 06, a nie przez 6.)

Na szczęście, to jest całkiem proste: wykorzystujemy funkcję Len w celu określenia liczny znaków w miesiącu (technicznie mówiąc w zmiennej strMonth). Jeżeli jest tylko jeden znak, stosujemy poniższy wiersz kodu, żeby dodać zero prowadzące 0, zmieniając w ten sposób 6 na 06:

strMonth = "0" & strMonth

Co zrobić, jeżeli w zmiennej strMonth naprawdę są dwa znaki? Zupełnie nic; jest OK. A jeżeli są trzy znaki w miesiącu? To znaczy, że zepsuł się komputer.

Teraz powtarzamy ten proces także dla dnia, używając funkcji Day w celu „wydobycia” części wczorajszej daty i, po raz kolejny, dodajemy w razie potrzeby zero prowadzące:

strDay = Day(Date - 1)



If Len(strDay) = 1 Then

    strDay = "0" & strDay

End If

Na końcu używamy funkcji Year w celu przypisania roku wczorajszej daty do zmiennej o nazwie strYear:

strYear = Year(Date - 1)

W takim przypadku nie ma potrzeby dodawania zera prowadzącego, ponieważ domyślnie lata są przekazywane jako wartości czterocyfrowe.

Kiedy już mamy pojedyncze kawałki, możemy zlepić z nich całą wczorajszą datę, a następnie ścieżkę dostępu bieżącego pliku – stosując następujący wiersz kodu:

strFileName = "C:\\Test\\BackupFile-" & strMonth & strDay & strYear  & ".txt"

Jak widzimy, to równanie jest całkiem proste: łączymy ścieżkę pliku oraz pierwszą część nazwy pliku (BackupFile-) ze zmiennymi reprezentującymi miesiąc, dzień oraz rok, doczepiając rozszerzenie pliku .txt na końcu. Jedyną trudnością jest tutaj to, że „\” jest znakiem zastrzeżonym w usłudze WMI; oznacza to między innymi, że ten znak (podobnie jak inne znaki zastrzeżone) należy odpowiednio oznaczyć przed użyciem Jak to zrobić? To proste: poprzedzamy go drugim znakiem „\”. Gdyby ktoś się zastanawiał: „Dlaczego C:**\\Test\\**BackupFile- zamiast C:\Test\BackupFile-”, ma już odpowiedź.

Kiedy już mamy bieżącą nazwę naszego pliku, stosujemy zwykłe wywołanie ExecQuery w celu połączenia się z plikiem za pomocą zmiennej strFileName, reprezentującej ścieżkę pliku:

Set colFiles = objWMIService.ExecQuery _

    ("Select * From CIM_DataFile Where Name = '" & strFileName & "'")

Przy założeniu, że wszystko idzie zgodnie z planem (a w przypadku Skrypciarzy wszystko zawsze idzie według planu; my po prostu mamy złe plany), powinniśmy uzyskać kolekcję (o nazwie colFiles) składającą się ze wszystkich plików mających wyznaczoną ścieżkę. A ponieważ ścieżka pliku musi być niepowtarzalna na jednym komputerze, oznacza to, że zlokalizowaliśmy nasz docelowy pliki i połączyliśmy się z nim.

Oznacza to także, że jesteśmy już prawie gotowi do zmiany nazwy pliku. Zanim jednak będziemy mogli to zrobić, musimy utworzyć nową nazwę dla naszego pliku. Na szczęście nie musimy się nad tym zbyt długo zastanawiać: już wiemy, że plik będzie mieć nazwę C:\Test\BackupFile-tu wstaw bieżącą datę-.txt. Mając to na uwadze, idziemy dalej i powtarzamy ten sam proces, który właśnie zakończyliśmy: pobieramy miesiąc, dzień i rok, lecz nie dla wczorajszej daty, a dzisiejszej. Kiedy już mamy wszystkie te dane, tworzymy nową nazwę pliku i zachowujemy tę wartość w zmiennej strNewFileName:

strNewFileName = "C:\\Test\\BackupFile-" & strMonth & strDay & strYear  & ".txt"

Teraz potrzebujemy jeszcze jednego wiersza kodu i metody Rename, żeby zmienić nazwę pliku:

errResult = objFile.Rename(strNewFileName

I mamy już wszystko, o co nam chodziło.

Tak, wyjaśnienia dotyczące skryptu przychodzą piszącemu te słowa Skrypciarzowi o wiele łatwiej niż wyrażanie własnych odczuć. No cóż. Trening czyni mistrza. Może za którymś razem ktoś w końcu zrozumie o co chodzi piszącemu te słowa Skrypciarzowi.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne