Centrum skryptów - Systemy operacyjne

Jak przenieść pliki z pulpitu do określonych folderów w zależności od ich rozszerzenia?

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 przenieść pliki z pulpitu do określonych folderów w zależności od ich rozszerzenia?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Mam pewien problem, chociaż myślę, że nie jestem jedyna i boryka się z tym wiele osób. Chodzi o bałagan na pulpicie i fakt, ze wala się tam wiele plików bez ładu i składu. Jakim skryptem się posłużyć, aby pobrać te wszystkie pliki z pulpitu i przenieść je do odpowiedniego folderu na pulpicie, w zależności od rozszerzenia. Na przykład, jeżeli plik ma rozszerzenie .doc, to chcę go przenieść do folderu o nazwie Doc, jeżeli ma rozszerzenie .xls to do folderu Xls. I tak dalej...

-- GA

Cześć Skrypciarze! Pytanie

Cześć, GA. Jeżeli śledziłaś losy Skrypciarzy w ostatnim tygodniu, to na pewno umierasz z ciekawości, co słychać u Skrypciarza Deana Tsaltasa, który to wyprowadził się do z powrotem do Halifaksu w Nowej Szkocji. Dziś rano dostaliśmy od niego zdjęcie, jak byczy się na plaży podczas weekendu. Dzięki, Stary, to naprawdę pomogło, 100% motywacji do pracy z rana, ale wiesz, nie wiem jak wy tam w Nowej Szkocji, ale tu w Seattle się pracuje... no i ogląda mecze od czasu do czasu...

Na szczęście nie zdemotywowało nas to aż tak bardzo, żeby nie móc napisać skryptu, który przenosi pliki z pulpitu do odpowiednich folderów, w zależności od ich rozszerzenia. Tu się pracuje, Dean! Zobacz, jak:

Const DESKTOP = &H10&



Set objShell = CreateObject("Shell.Application")



Set objFolder = objShell.Namespace(DESKTOP)

Set objFolderItem = objFolder.Self

strPath = objFolderItem.Path



strComputer = "."



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



Set colFiles = objWMIService.ExecQuery _

    ("ASSOCIATORS OF {Win32_Directory.Name='" & strpath & "'} Where " _

        & "ResultClass = CIM_DataFile")



Set objFSO = CreateObject("Scripting.FileSystemObject")



For Each objFile in colFiles

    strDesktopFolder = strPath & "\" & objFile.Extension

    If objFSO.FolderExists(strDesktopFolder) Then

        strTarget = strDesktopFolder & "\" 

        objFSO.MoveFile objFile.Name, strTarget

    Else

        Set objFolder = objFSO.CreateFolder(strDesktopFolder)

        strTarget = strDesktopFolder & "\" 

        objFSO.MoveFile objFile.Name, strTarget

    End If

Next

Zaczynamy od zdefiniowania stałej o nazwie DESKTOP i ustawienia jej wartości na &H10&; będziemy tej wartości potrzebować podczas łączenia się folderem Pulpit na komputerze użytkownika. Słuszna uwaga! Skrypt przenosi pliki przechowywane tylko i wyłącznie w folderze pulpitu użytkownika (np. C:\Documents and Settings\kenmyer\Desktop). Na pulpicie wyświetlane są bowiem pliki pochodzące z dwu źródeł – folderu danego użytkownika oraz z analogicznego folderu wszystkich użytkowników. Co zrobić, jeżeli chcemy również przenieść pliki z folderu pulpitu wszystkich użytkowników? Najprostszą metodą jest utworzyć duplikat skryptu, a następnie zastąpić pierwszy wiersz kodu następującym wierszem:

Const ALL_USERS_DESKTOP = &H19&

Upewnijcie się, czy aby na pewno zastąpiliście stałą DESKTOP stałą ALL_USERS_DESKTOP.

Jeżeli jednak nie interesuje Was folder pulpitu należący do wszystkich użytkowników, to już nie wspomnę o nim ani słowa więcej.

Po zdefiniowaniu stałej tworzymy wystąpienie obiektu Shell.Application, po czym, używając poniższych wierszy, kodu łączymy się z folderem Pulpit, pobieramy ścieżkę do tego folderu i zapisujemy ją w zmiennej strPath (e.g., C:\Documents and Settings\kenmyer\Desktop):

Set objFolder = objShell.Namespace(DESKTOP)

Set objFolderItem = objFolder.Self

strPath = objFolderItem.Path

Jeżeli znacie już obiekt Shell.Application, myślicie pewnie sobie, „Hmmm, obiektu Shell używa się na komputerze lokalnym. Czy oznacza to, że skrypt działa tylko na komputerze lokalnym?”. Odpowiedź: Tak, skrypt napisany jest dla komputera lokalnego i są ku temu różne powody. Trudno przecież sprawdzić, kto jest zalogowany w danym momencie na komputerze zdalnym, dlatego też trudno jest ustalić, który z folderów jest folderem Pulpit. Nie jest to niemożliwe, ale dość trudne. Dlatego też postanowiliśmy ograniczyć działanie skryptu do komputera lokalnego.

Uwaga: Jak zwykle podpuszczam Was trochę. Jeżeli pracujecie na komputerze zdalnym, uruchomcie skrypt jako skrypt logowania lub wylogowywania użytkownika i wszystko będzie grało.

Po pobraniu ścieżki do folderu pulpit łączymy się z usługą WMI na komputerze lokalnym. Następnie, w celu zwrócenia całej kolekcji plików znajdujących się w folderze Pulpit, używamy poniższej kwerendy:

Set colFiles = objWMIService.ExecQuery _

    ("ASSOCIATORS OF {Win32_Directory.Name='" & strpath & "'} Where " _

        & "ResultClass = CIM_DataFile")

Teraz możemy już utworzyć wystąpienie obiektu Scripting.FileSystemObject i ustawić pętlę For Each, która przejdzie nam przez całą kolekcję plików i – eureka- przeniesie je do odpowiednich folderów!!!

W celu przeniesienia plików z pulpitu, pierwsze, co musimy zrobić w pętli, to uruchomić następujący wiersz kodu:

strDesktopFolder = strPath & "\" & objFile.Extension

Jak zapewne pamiętacie, chcemy teraz przenieść wszystkie pliki z pulpitu do odpowiednich folderów. Pytanie dla nas – czym są odpowiednie foldery??? Proste, to foldery o nazwie takiej samej jak rozszerzenie (na przykład wszystkie pliki o rozszerzeniu .doc będą automatycznie przenoszone do folderu Doc). Wiersz kodu powyżej zwraca właśnie uwagę na to, jakie rozszerzenie ma dany plik – właściwość Extension (która równa jest rozszerzeniu minus kropka), a następnie używa tej wartości do utworzenie ścieżki takiej jak ta:

C:\Documents and Settings\kenmyer\Desktop\Doc

Nic więcej niż folder Doc, umieszczony w folderze Pulpit.

Oczywistym jest, że nie można niczego przenieść do folderu, jeżeli taki folder nie istnieje. Dlatego też naszym kolejnym krokiem będzie wywołanie metody FolderExists i ustalenie, czy nasz folder Pulpit zawiera w sobie folder Doc czy nie.

If objFSO.FolderExists(strDesktopFolder) Then

Jeżeli tak, to uruchamiamy poniższy fragment kodu:

strTarget = strDesktopFolder & "\" 

objFSO.MoveFile objFile.Name, strTarget

W pierwszym wierszu dodajemy po prostu \ po nazwie folderu Doc – dzięki temu nadajemy naszej wartości zmienną strTarget:

C:\Documents and Settings\kenmyer\Desktop\Doc\

Po co nam to wszystko? Dzięki temu nasz plik zostanie skopiowany do folderu. Jeżeli nie dodamy znaku \ , możemy otrzymać komunikat o błędzie: „File already exists error.” Dlaczego? Ponieważ bez odwróconego ukośnika obiekt plik systemowy będzie próbował zmienić nazwę pliku .doc na na nazwę folderu (C:\Documents i Settings\kenmyer\Desktop\Doc). Prawda, to trochę dziwne, a w sumie nawet irytujące, ale tak to już działa i nic się nie da na to poradzić. Nie ma się co jednak irytować czymś tak małym jak odwrócony ukośnik – zaufać mi, użyć go, i skrypt będzie działał cacy.

Uwaga: Niezadowolenie radzę zostawiać na ważniejsze ku temu okazje, jak na przykład otrzymanie zdjęć z plaży w trakcie ciężkiej pracy lub otrzymanie kartki ze słonecznej Australii w momencie, gdy za oknem -10.

W drugim wierszu wywołujemy metodę MoveFile i przenosimy żądane pliki z pulpitu do odpowiedniego folderu. Potem ponownie uruchamiamy pętlę i powtarzamy cały proces dla następnego pliku w kolekcji.

Wszystko pięknie, co jednak, jeżeli obiekt Doc jeszcze nie istnieje? Proste, uruchamiamy tylko poniższy fragment kodu i już będzie istniał. Polecam piosenkę „Zaczaruję Twój świat, jestem czarodziejem.”:

Set objFolder = objFSO.CreateFolder(strDesktopFolder)

strTarget = strDesktopFolder & "\" 

objFSO.MoveFile objFile.Name, strTarget

Jak widać, tylko jedna rzecz ulega nam zmianie – wywołujemy metodę CreateFolder i tworzymy tym samym nowy folder pulpitu (Pamiętacie? C:\Documents i Settings\kenmyer\Desktop\Doc?). Po utworzeniu folderu przypisujemy ścieżce folderu (plus nasz odwrócony ukośnik \) zmienną strTarget, a następnie wywołujemy metodę MoveFile i przenosimy plik do folderu.

Teraz pętla przeszła już przez całość naszego aktualnego zagadnienia, możemy więc powtórzyć cały proces „pętlowania” dla następnego pliku w kolekcji...

Mam nadzieję, ze to odpowiada na Twoje pytanie GA. Jeżeli chciałabyś podpytać o prognozę pogody na cały przyszły rok dla Seattle to : dziś-deszcz, jutro-przelotne opady, pojutrze-opady, itd. Jeżeli jednak chciałabyś (jak autor) popaść w głęboką depresję, to Dean z radością na pewno przedstawi prognozę pogody dla Halifaksu – dziś-słońce, jutro-słońce, pojutrze-słońce... Dobrze, że to nie Floryda... Urodziłem się chyba po złej stronie kontynentu...

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne