Centrum skryptów - Systemy operacyjne

Jak zmienić rozszerzenia wszystkich plików znajdujących się w folderze?

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 zmienić rozszerzenia wszystkich plików znajdujących się w folderze?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Zrobiliśmy kopie zapasowe wielu plików znajdujących się w folderze. Podczas tworzenia kopii zapasowych wstawiono słowo „old” jako część rozszerzenia (np. plik Filename.exe nazywa się teraz Filename.oldexe). Jak przywrócić tym plikom pierwotne nazwy i rozszerzenia?

-- RP

Cześć Skrypciarze! Odpowiedź

Cześć, RP. Trochę mamy zamieszania w siedzibie Skrypciarzy, wszyscy szykują się na konferencję TechEd 2007. Jeżeli Wy też tam będziecie, bardzo będzie nam miło, jeśli wpadniecie choćby na krótką pogawędkę. A ponieważ wiemy, że ze Skrypciarzami nikt nie chce gadać, jeżeli nie otrzyma czegoś w zamian, będziemy rozdawać egzemplarze książki Dr. Scripto’s Fun Book oraz laleczki Dr Scripto. Pamiętajcie: CMP Media Booth (stanowisko 1301) w Partners Expo Hall.

Uwaga. OK, no dobrze. W zasadzie to nawet nie musicie nic mówić, wystarczy, że po prostu wpadniecie, weźmiecie tę książkę i tyle. Możecie nawet nie nawiązywać kontaktu wzrokowego.

Właśnie zdaliśmy sobie sprawę z tego, że nie wszyscy wybierają się na tę konferencję, szczególnie jeśli mieszkają za oceanem. Dla tych, których tam nie będzie, przygotowaliśmy całą masę materiału, żeby się nie nudzili. Oprócz codziennych artykułów Cześć Skrypciarze, mamy także nowe informacje dotyczące powłoki Windows PowerShell i dwuczęściowy artykuł o wypalaniu płyt CD w systemie Windows Vista. Innymi słowy, Centrum Skryptów nie przestanie działać tylko dlatego, że Skrypciarze wyjeżdżają na tydzień. Więcej szczegółów na naszej stronie (j.ang.).

Tymczasem musimy uporządkować sprawy bieżące. Zaczynamy od skryptu, który usunie słowo old z rozszerzeń plików znajdujących się w folderze:

strComputer = "."



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



Set colFiles = objWMIService.ExecQuery _

    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Test'} Where " _

        & "ResultClass = CIM_DataFile")



For Each objFile In colFiles

    strExtension = objFile.Extension 

    strExtension = Replace(strExtension, "old", "")

    strNewName = objFile.Drive & objFile.Path & objFile.FileName & "." & strExtension

    errResult = objFile.Rename(strNewName)

Next

Zapewne teraz mamy wyjaśnić, jak ten skrypt działa. Żeby nam tylko samolot nie uciekł.

Najpierw łączymy się z usługą WMI na lokalnym komputerze. Uprzedzając wszelkie pytania, tak – ten skrypt zadziała w przypadku zdalnych komputerów; wystarczy tylko przypisać nazwę zdalnego komputera do zmiennej strComputer. Na przykład:

strComputer = "atl-fs-01"

Po utworzeniu połączenia stosujemy zapytanie Associators Of w celu uzyskania kolekcji wszystkich plików (tzn. wszystkich wystąpień klasy CIM_DataFile) znajdujących się w folderze C:\Test:

Set colFiles = objWMIService.ExecQuery _

    ("ASSOCIATORS OF {Win32_Directory.Name='C:\Test'} Where " _

        & "ResultClass = CIM_DataFile")

Tak, ten kod wygląda znajomo. Na razie jednak nie musimy się tym przejmować. Po prostu zastępujemy fragment C:\Test nazwą naszego folderu i wszystko będzie w porządku.

Następnie uruchamiamy pętlę For Each, która przejdzie przez wszystkie elementy znajdujące się w kolekcji (czyli przez wszystkie elementy znajdujące się w folderze). Wewnątrz tej pętli pobieramy istniejące rozszerzenie (zachowane we właściwości Extension) i przypisujemy tę wartość do zmiennej o nazwie strExtension:

strExtension = objFile.Extension

W języku WMI rozszerzenie pliku nie zawiera kropki; oznacza to, że jeżeli nasz pierwszy plik ma nazwę Filename.oldexe, to zmienna strExtension będzie miała wartość: oldexe.

Niby wszystko OK, ale chcemy się pozbyć słowa old. Jak to zrobimy? Właśnie tak:

strExtension = Replace(strExtension, "old", "")

Teraz wywołujemy funkcję Replace i zastępujemy słowo old niczym („”). Zgadnijcie, jaką wartość ma teraz zmienna strExtension? Jak zwykle, wszystko wiecie:

exe

Skoro już mamy pierwotne rozszerzenie pliku, czas nadać plikowi nową nazwę. Kiedy zmieniamy nazwę za pomocą WMI, musimy podać całą ścieżkę dostępu jako nową nazwę pliku; innymi słowy, musimy podać C:\Test\Filename.exe, a nie tylko Filename.exe. Dlatego też poniższy wiersz kodu zawiera kompletną ścieżkę dostępu do pliku:

strNewName = objFile.Drive & objFile.Path & objFile.FileName & "." & strExtension

Używamy teraz wybranych właściwości pierwotnych plików oraz rozszerzenia nowego pliku w celu utworzenia nowej ścieżki dostępu. Właściwość Drive, jak można się spodziewać, przekazuje nam informację o nośniku, na którym zachowany jest plik. W ten sposób:

C:

Path to taka dziwna właściwość, która daj nam informacje o folderze bez litery nośnika i nazwy pliku. Innymi słowy, jeżeli ścieżka to C:\Test\Filename.exe, właściwość Path ma wartość \Test\. W połączeniu z właściwością Drive, da nam to ścieżkę wyglądającą tak:

C:\Test\

Zostaje nam jeszcze właściwość FileName, która jest nazwą pliku bez rozszerzenia (oraz, oczywiście, bez kropki pomiędzy nazwą a rozszerzeniem). W ten sposób uzyskujemy:

C:\Test\Filename

Teraz dołączamy kropkę oraz rozszerzenia pliku (nowe, poprawione i zachowane w zmiennej strExtension). To nam da całkiem nową ścieżkę dostępu do pliku:

C:\Test\Filename.exe

Kiedy już mamy nowiutką ścieżkę dostępu, wywołujemy metodę Rename i zmieniamy nazwę pliku:

errResult = objFile.Rename(strNewName)

Od tego momentu uruchamiamy pętlę i powtarzamy proces dla następnego pliku z kolekcji.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne