Centrum skryptów - Systemy operacyjne

Jak zmieniać nazwy plików rosnąco w zależności od ich daty utworzenia?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

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 zmieniać nazwy plików rosnąco w zależności od ich daty utworzenia?

Cześć, Skrypciarze! Nie wiem czy też borykacie się z problemem zdjęć, ale mój jest niemały. Próbuję jakoś ustawić chronologicznie zdjęcia, a że są z różnych aparatów mają inne nazwy. Niektóre na przykład zaczynają się od DSC, a po tym następuje numer, inne zaczynają się od IMG plus numer, a jeszcze inne „NY_2007_" + numer + ".jpg". Czy można jakoś ogarnąć ten chaos?

-- EF

Cześć, EF! Jasne, że można, Skrypciarze są w stanie ogarnąć każdy chaos, na przykład ten związany z nagrodami i certyfikatami z naszej Skrypciarskiej Olimpiady (j.ang.), nas też bowiem naszło dzisiaj na porządkowanie. Właśnie dziś wysłaliśmy email do każdego, komu należy się nagroda i/bądź certyfikat. Nie mamy jednak wszystkich Waszych adresów, a jak powszechnie wiadomo, trudno coś wysłać nie mając adresu (no chyba że jest się św. Mikołajem). Tak to już jest na świecie, jeżeli więc nie przesłaliście nam swojego adresu, to możecie to jeszcze zrobić, ino szybko.

Jak już pisałem, obecnie borykamy się z adresami, ale gdzieś za tydzień rozpoczniemy rozsyłanie naszych „zaledwie” 700 certyfikatów i 400 gadżetów. Prosimy więc o cierpliwość. Jeżeli nie uda się Wam dostarczyć nam adresu, to postaramy się skontaktować z Biegunem Północnym i możecie się spodziewać upominków już w okolicach 24 grudnia…

Póki co palce nam jeszcze nie zdrętwiały od przylepiania znaczków, jesteśmy więc w stanie podzielić się z Wami skryptem, który sortuje wszystkie pliki w danym folderze w porządku chronologicznym, a następnie zmienia ich nazwę:

Const adVarChar = 200

Const MaxCharacters = 255



Set DataList = CreateObject("ADOR.Recordset")

DataList.Fields.Append "FileName", adVarChar, MaxCharacters

DataList.Fields.Append "FileDate", adVarChar, MaxCharacters

DataList.Open



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFolder = objFSO.GetFolder("C:\New York")



Set colFiles = objFolder.Files



For Each objFile in colFiles

    DataList.AddNew

    DataList("FileName") = objFile.Path

    DataList("FileDate") = objFile.DateCreated

    DataList.Update

Next



DataList.Sort = "FileDate"



DataList.MoveFirst

i = 1



Do Until DataList.EOF

    If i < 10 Then

        x = CStr("000" & i)

    ElseIf i < 100 Then

        x = CStr("00" & i)

    ElseIf i < 1000 Then

        x = CStr("0" & i)

    Else

        x = i

    End If



    strNewName = "C:\New York\NY_2007_" & x & ".jpg"

    objFSO.MoveFile DataList.Fields.Item("FileName"), strNewName



    i = i + 1

    DataList.MoveNext

Loop

Zmiana nazw za pomocą skryptu VBScript to łatwizna, obiekt FileSystemObject może się z tym uporać za pomocą pojedynczego wiersza kodu. Łatwo jest także pobrać datę utworzenia każdego pliku, trzeba tylko ładnie poprosić obiekt FileSystemObject aby zwrócił wartość właściwości DateCreated. Tyle dobrych wiadomości. Teraz te złe – nie da się w ten sposób przesortować plików w porządku chronologicznym, a to dlatego, ze ani VBScript ani obiekt FileSystemObject nie mają takiej funkcji. Zdolność taka uzależniona jest od możliwości sortowania danych.

Właśnie wtedy przychodzi nam z pomocą „rozłączony” zestaw rekordów. Nie będziemy mówić o nim dziś za długo, bo jeszcze wiele słów przed nami, jeżeli jednak chcecie wiedzieć „tu i teraz”, to zajrzyjcie do przewodnika Microsoft Windows 2000 Scripting Guide (j.ang.). Na dzień dzisiejszy wystarczy Wam wiedzieć, że rozłączony zestaw rekordów jest taką : „wirtualną” bazą danych, taką, która istnieje tylko w pamięci. Czy potrzebna nam taka baza danych? No trochę tak, a w sumie nawet bardzo tak. Tam właśnie znajdziemy miejsce, gdzie będziemy przechowywać nasze ścieżki plików, a potem, co dla nas najważniejsze, możemy przesortować pliki pod kątem daty utworzenia.

W celu utworzenia takiego zestawu rekordów musimy zacząć od zdefiniowania pary stałych - adVarChar (której używać będziemy w celu utworzenia bazy danych, która korzysta z danego typu danych) oraz MaxCharacters (której używać będziemy w celu wskazania, że pole bazy danych może zawierać 225 znaków). Po zdefiniowaniu tych stałych tworzymy wystąpienie obiektu ADOR.Recordset (dzięki któremu będziemy mogli utworzyć rozłączony zestaw rekordów), a następnie korzystając z metody Append dodajemy dwa nowe pola do naszego zestawu rekordów, jedno o nazwie FileName a drugie FileDate:

DataList.Fields.Append "FileName", adVarChar, MaxCharacters

DataList.Fields.Append "FileDate", adVarChar, MaxCharacters

Po utworzeniu tych dwóch pól metodą Open otwieramy nasz zestaw rekordów – teraz już możemy zacząć dodawać do niego dane. Tylko gdzie te dane?

Na szczęście dla nas nie stanowi to żadnego problemu. Dla początkujących – tworzymy wystąpienie obiektu Scripting.FileSystemObject, a następnie korzystamy z metody GetFolder i łączymy się z folderem C:\New York. Do tego służą poniższe wiersze kodu:

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFolder = objFSO.GetFolder("C:\New York")

Po połączeniu się z C:\New York pobieramy kolekcję wszystkich plików w tym folderze poprzez ustawienie odwołania do obiektu do właściwości Files:

Set colFiles = objFolder.Files

Proste, nieprawdaż?

Naszym kolejnym krokiem będzie pobranie ścieżki pliku i utworzenie danych dla każdego z tych plików, a następnie dodanie tej informacji do naszego rozłączonego zestawu rekordów. Ustawiamy teraz pętlę, która przechodzi przez każdy element kolekcji. Wewnątrz pętli używamy poniższego fragmentu kodu, który tworzy nowy rekord dla pierwszego pliku w kolekcji, ustawiając wartość pola FileName na wartość właściwości Path, natomiast pola FileDate na wartość właściwości DateCreated:

DataList("FileName") = objFile.Path

DataList("FileDate") = objFile.DateCreated

Po tych wszystkich operacjach przywołujemy metodę Update i oficjalnie dodajemy nasz rekord do zestawu, a następnie wracamy do początku pętli i powtarzamy cały proces dla kolejnego pliku w kolekcji. Powinniśmy mieć teraz rekord dla każdego pliku w folderze C:\New York, musimy więc przesortować te dane pod kątem daty utworzenia, korzystamy zatem z metody Sort, po której następuje nazwa pola według którego chcemy przesortować:

DataList.Sort = "FileDate"

Mamy teraz rozłączony zestaw rekordów zawierający ścieżki plików oraz daty utworzenia, przesortowany w porządku chronologicznym. Teraz można już iść na lunch. Wrócimy za godzinę.

OK, już z powrotem. Możemy więc przystąpić do zmiany nazw plików, musimy jednak przywołać najpierw metodę MoveFirst i umieścić kursor na początku naszego zestawu rekordów, a następnie ustawić wartość licznika na 1:

DataList.MoveFirst

i = 1

Teraz już naprawdę możemy przystąpić do zmieniania nazw plików. Zaczynamy od ustawienia pętli Do Until, która będzie działała, aż do momentu, kiedy właściwość EOF (end-of-file) zestawu rekordów będzie równa True (innymi słowy, chcemy przechodzić pętlą, aż do momentu, kiedy skończą nam się rekordy).

Co w pętli? Zobaczcie sami:

If i < 10 Then

    x = CStr("000" & i)

ElseIf i < 100 Then

    x = CStr("00" & i)

ElseIf i < 1000 Then

    x = CStr("0" & i)

Else

    x= i

End If

Dodajemy tu zera do zmiennej licznika w miejscach, gdzie jest to konieczne. Jeżeli na przykład i jest mniejsze niż 0 (pierwszy warunek w twierdzeniu If Then), to musimy dodać do zmiennej x trzy poprzedzające zera (000) plus i. Jeżeli i jest równe 1 (tak będzie podczas pierwszego przejścia pętli) to x będzie równe:

0001

Jeżeli i jest większe niż 9, a mniejsze niż 100 to dodajemy dwa zera. Jeżeli zaś i jest większe niż 99, natomiast mniejsze niż 999 to dodajemy…, tak, właśnie, jedno zero. W momencie, gdy i przewyższy 999 to nadamy mu po prostu wartość x. W zależności od liczby plików w folderze da nam to następujące wartości:

0009

0099

0999

9999

Dlaczego się tym tak przejmujemy? Nie wspominałem, że jesteśmy estetami? Rzućcie tylko okiem:

NY_2007_0003.jpg

NY_2007_0077.jpg

NY_2007_0444.jpg

NY_2007_1111.jpg

Tak wyglądałoby to bez poprzedzających zer:

NY_2007_3.jpg

NY_2007_77.jpg

NY_2007_444.jpg

NY_2007_1111.jpg

Po nadaniu wartości naszej x tworzymy nowy plik za pomocą poniższego wiersza kodu:

strNewName = "C:\New York\NY_2007_" & x & ".jpg"

Bierzemy nasz ciąg C:\New York\NY_2007, dodajemy wartość x, a następnie dodajemy rozszerzenie .jpg. Po pierwszym przejściu pętli da nam to następującą ścieżkę:

C:\New York\NY_2007_0001.jpg

Możemy teraz zmienić nazwę pierwszego pliku w kolekcji (DataList.Fields.Item("FileName")) za pomocą pojedynczego wiersza kodu:

objFSO.MoveFile DataList.Fields.Item("FileName"), strNewName

Teraz zwiększamy wartość i o 1, przywołujemy metodę MoveNext i przechodzimy do kolejnego pliku w zestawie rekordów. Po skończeniu nasz folder powinien wyglądać w następujący sposób:

NY_2007_0001.jpg

NY_2007_0002.jpg

NY_2007_0003.jpg

NY_2007_0004.jpg

Itp., itd.

Chyba starczy, EF, no nie? I tak już trochę za bardzo się rozpisaliśmy porównując to z ostatnim skryptem w którym więcej miejsca niż skrypt zajęło nam zdjęcie Japonki sprzedającej piwo na stadionie. Tym razem bez obrazków, choć o zdjęciach.

Pamiętaj tylko EF, że jeżeli wygrałeś coś w naszej Skrypciarskiej Olimpiadzie, to niezwłocznie prześlij nam swój adres. No chyba, że chcesz czekać do grudnia….

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne