Centrum skryptów - Systemy operacyjne

Jak dodać datę zrobienia zdjęcia do nazw plików moich cyfrowych zdjęć?

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 dodać datę zrobienia zdjęcia do nazw plików moich cyfrowych zdjęć?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak zmienić nazwę wszystkich plików .JPG znajdujących się w folderze tak, aby data zrobienia zdjęcia zawierała się w nazwie pliku?

-- NH

Cześć Skrypciarze! Odpowiedź

Cześć, NH. Witamy w rubryce Cześć, Skrypciarze, jedynej codziennej rubryce witryny TechNet pisanej bez użycia sterydów, amfetaminy, ludzkiego hormonu wzrostu ani innych form dopingu. Każdego ranka piszący artykuł Skrypciarz przechodzi dogłębne testy na obecność narkotyków w organizmie i jak dotąd wynik każdego z nich był negatywny. Rubryka Cześć, Skrypciarze pisana jest w zgodzie z Naturą.

Interesujące jest, że Redaktorka jest ciągle zaniepokojona faktem, iż nasza rubryka jest pisana bez sztucznego dopingu w postaci sterydów, amfetaminy ani żadnych innych wspomagaczy. Twierdzi, że nasza rubryka jest strasznie nudna i powinniśmy zrobić coś, żeby ją jakoś ożywić. Niedawno na początku artykułu stwierdziliśmy, że nie mamy nic interesującego do powiedzenia. Według niej nikt nie chce czytać tego typu tekstów. Powinniśmy więc coś zrobić.

Z całym należnym szacunkiem dla naszej Redaktorki, każdy nasz oddany czytelnik wie, że praktycznie wszystkie pisane przez nas artykuły zaczynają się od fascynującej anegdoty o Synu Skrypciarza i jego dokonaniach. Nie ma już nic bardziej fascynującego. Nawet, jeżeli zdarzy się taki dzień (czasem nawet miesiąc), w którym naprawdę nie ma nic ciekawego do powiedzenia, Skrypciarze odmawiają zażywania jakichkolwiek wspomagaczy. Bo i po co. Za każdym razem, gdy w nasze życie wkrada się monotonia możemy zerknąć na podobny do poniższego skryptu i od razy przestaje być nudno:

On Error Resume Next



Set objFSO = CreateObject("Scripting.FileSystemObject")



Set objConnection = CreateObject("ADODB.Connection")

Set objRecordSet = CreateObject("ADODB.Recordset")



objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"



objRecordSet.Open "SELECT System.ItemPathDisplay, System.Photo.DateTaken FROM SYSTEMINDEX _ 

    Where System.ItemFolderPathDisplay = 'C:\Test'", objConnection



objRecordSet.MoveFirst



Do Until objRecordset.EOF

    strName = objRecordset.Fields.Item("System.ItemPathDisplay")

    arrName = Split(strName, ".")



    dtmPhotoDate = objRecordset.Fields.Item("System.Photo.DateTaken")

    strDay = Day(dtmPhotoDate)

    strMonth = Month(dtmPhotoDate)

    strYear = Year(dtmPhotoDate)

    strNewName = arrName(0) & "_" & strMonth & "_" & strDay & "_" & strYear & "." & arrName(1)

    

    objFSO.MoveFile strName , strNewName

    objRecordset.MoveNext

Loop

W głowie się może zakręcić z nadmiaru emocji od patrzenia na taki skrypt!

Dajcie nam chwilę albo dwie na ochłonięcie i zaraz wyjaśnimy, jak on działa. Zanim jednak to zrobimy, musimy zgłosić pewne zastrzeżenie. Data zrobienia zdjęcia cyfrowego jest zachowywana za każdym razem, gdy zapisujemy plik na dysku twardym; żeby ją odnaleźć, otwieramy Ekspolrator Windows lub folder Mój komputer, klikamy prawym klawiszem myszy na plik, następnie klikamy opcję Właściwości, potem kartę Podsumowanie, a w końcu Zaawansowane. (W systemie Windows Vista, klikamy prawym klawiszem Właściwości, a następnie zakładkę Szczegóły.) To dobra wiadomość. A zła? Nie ma żadnego elementu w systemie operacyjnym (wcześniejszym niż Windows Vista), który pozwoliłby na dostęp do tych informacji za pomocą skryptu. Można wykorzystać FileSystemObject lub usługę WMI w celu określenia daty utworzenia pliku (czyli daty zapisania pliku na twardym dysku), ale nie ma możliwości określenia daty zrobienia zdjęcia. Absolutnie żadnej.

Jak więc udało nam się stworzyć skrypt określający datę zrobienia zdjęcia cyfrowego i dodający tę datę do nazwy pliku? To proste: dzięki sterydom.

Zaraz zaraz. Jak się okazuje to nie były sterydy. Wykorzystaliśmy technologię Desktop Search 3.0 (j.ang.). (Te dwie rzeczy zawsze nam się mylą.) Oczywoście Desktop Search 3.0 to oprogramowanie, które przed zastosowaniem trzeba najpierw pobrać, zainstalować i skonfigurować. (Chyba, że pracujemy w systemie Windows Vista, w przypadku którego ta technologia jest elementem wbudowanym.) Z tym może być pewien kłopot, wszyscy mamy świadomość, że wiele osób niechętnie pobiera i instaluje tego typu komponenty. Z drugiej jednak strony, Desktop Search 3.0 to całkiem fajne oprogramowanie. A ponadto jest to jedyny znany nam sposób na rozwiązanie naszego problemu.

Nie będziemy się dzisiaj za bardzo zagłębiać w technologię Desktop Serach, więcej informacji na temat tej technologii i jej działania znajduje się w naszym artykule Seek and Ye Shall Find (j.ang.). Zamiast tego, ograniczymy się do wskazówki, że Desktop Serach indeksuje zaznaczone foldery i miejsca przechowywania danych na komputerze (o tak, mamy pełną kontrolę nad tym, co zostanie, a co nie zostanie zindeksowane), a następnie wyświetla te informacje, używając obiektów ADO (ActiveX Data Objects). Co to oznacza? Oznacza to, że można napisać prosty skrypt bazy danych – i zastosować standardową kwerendę SQL – a możliwe będzie wykonanie szeregu przydatnych czynności. Niby jakich? Na przykład określenie daty zrobienia zdjęcia cyfrowego.

Zatem jak określić datę zrobienia zdjęcia cyfrowego? Na początek tworzymy wystąpienie obiektu Scripting.FileSystemObject, które wykorzystamy, gdy przyjdzie czas na zmianę nazw naszych plików. Następnie tworzymy wystąpienia obiektów bazy danych ADODB.Connection oraz ADODB.Recordset, a potem stosujemy poniższy wiersz kodu w celu połączenia się z magazynem danych narzędzia Desktop Search:

objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"

Nawiasem mówiąc, całe to wstępne ustawianie i konfiguracja to tekst standardowy: można wykorzystać ten kod w niezmienionej postaci w każdym skrypcie wykorzystującym technologię Desktop Search. Częścią, którą należy zmienić i na której się koncentrujemy to kwerenda SQL:

objRecordSet.Open "SELECT System.ItemPathDisplay, System.Photo.DateTaken FROM SYSTEMINDEX _ 

    Where System.ItemFolderPathDisplay = 'C:\Test'", objConnection

I znowu; nie będziemy jej dzisiaj szczegółowo omawiać. Wystarczy nam informacja, że zgłaszamy zapotrzebowanie na informacje z indeksu systemowego narzędzia Desktop Search. Jakie informacje? Potrzebujemy dwie wartości właściwości: System.ItemPathDisplay (ścieżka pliku) oraz System.Photo.DateTaken (sami się możecie domyślić, co to jest). Oczywiście nie chcemy pobrać tej informacji dla każdego pliku znajdującego się na komputerze (chociaż moglibyśmy, gdybyśmy tylko chcieli). Zamiast tego, pobietamy tylko informacje dotyczące plików znajdujących się w folderze C:\Test. Do tego posłuży nam klauzula Where: ograniczy ona pobierane dane do elementów posiadających właściwość System.ItemFolderPathDisplay (ścieżkę pliku) o wartości C:\Test.

PO wykonaniu polecenia Open otrzymujemy zbiór rekordów składający się ze ścieżki pliku oraz daty zrobienia zdjęcia dla wszystkich plików znajdujących się w folderze C:\Test. W celu dodania daty zrobienia zdjęcia do każdej nazwy pliku musimy uruchomić dla tego zbioru plików pętlę o nazwie Do Until, która będzie działać dopóki właściwość EOF (End of File) nie osiągnie wartości True:

Do Until objRecordset.EOF

A co zrobimy z tym zbiorem rekordów? No cóż, na początek pobierzemy ścieżkę pliku dla pierwszego pliku w kolekcji i zachowamy tę wartość w zmiennej o nazwie strName:

strName = objRecordset.Fields.Item("System.ItemPathDisplay")

Oznacza to, że zmienna strName będzie miała wartość podobną do C:\Test\100_0011.JPG. Zdecydowaliśmy umieścić datę zrobienia zdjęcia na końcu nazwy pliku, nadając naszemu plikowi nową nazwę w stylu C:\Test\100_0011_8_3_2007.JPG (zakładając oczywiście, że zdjęcie zostało zrobione 3 sierpnia 2007). Mając to na uwadze, używamy funkcji Split w celu pobrania ścieżki pliku i przekonwertowania jej na tablicę o nazwie arrName:

arrName = Split(strName, ".")

Używając kropki jako delimitera (zakładamy oczywiście, że w nazwie pliku znajduje się tylko jedna kropka) otrzymujemy tablicę składającą się z następujących elementów:

TextBox1.Value = ""
  • C:\Test\100_0011
  • JPG

Czy to naprawdę nam pomoże w zmianie nazwy pliku? Zaraz się przekonamy.

Najpierw jednakże musimy pobrać datę zrobienia zdjęcia i zachować ją w zmiennej o nazwie dtmPhotoDate:

dtmPhotoDate = objRecordset.Fields.Item("System.Photo.DateTaken")

Następnie zastosujemy poniższe wiersze kodu (oraz funkcje skryptu VBScript Day, Month oraz Year) w celu wyodrębnienia dnia (3), miesiąca (8) oraz roku (2007) z daty zrobienia zdjęcia:

strDay = Day(dtmPhotoDate)

strMonth = Month(dtmPhotoDate)

strYear = Year(dtmPhotoDate)

Wszystko jasne? To dobrze; w takim przypadku nie będziecie mieli problemów ze zrozumieniem następującego wiersza kodu:

strNewName = arrName(0) & "_" & strMonth & "_" & strDay & "_" & strYear & "." & arrName(1)

Teraz tylko tworzymy nową ścieżkę pliku składającą się z następujących elementów:

  • C:\Test\100_0011 (element 0 w tablicy arrName)
  • _
  • 8 (wartość zmiennej strMonth)
  • _
  • 3 (wartość zmiennej strDay)
  • _
  • 2007 (wartość zmiennej strYear)
  • .
  • JPG (element 1 w tablicy)

Co otrzymamy na koniec? Coś wyglądającego tak: C:\Test\100_0011_8_3_2007.JPG. Oczywiście, że jest to nasza oryginalna ścieżka pliku wraz z datą zrobienia zdjęcia.

Reszta jest bardzo prosta. W celu zmiany nazwy pliku stosujemy obiekt FileSystemObject oraz metodę MoveFile jak poniżej:

objFSO.MoveFile strName , strNewName

Rzeczywiście jest to zabawny sposób zmiany nazwy pliku: zamiast używania polecenia w stylu Rename, przesuwamy plik ze starej ścieżki (C:\Test\100_0011.JPG) do nowej ścieżki (C:\Test\100_0011_8_3_2007.JPG). Nie jest to najbardziej intuicyjne działanie na świecie, ale ostatecznie nazwa pliku zostaje zmieniona, a przecież tylko na tym nam zależało.

W tym momencie po prostu wywołujemy metodę MoveNext w celu przejścia do następnego rekordu w zbiorze. I na tym kończymy.

Jak już dobrze wiemy, Skrypciarze nie stosują żadnych wspomagaczy. Wiemy, że bardzo trudno w to uwierzyć, w końcu niejeden z naszych czytelników zastanawiał się podczas czytania naszej rubryki: „Na jakich prochach jedzie ten koleś??” Ale nie, my jesteśmy czyści.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne