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