Centrum skryptów - Systemy operacyjne

Jak mogę uzyskać listę wszystkich plików w folderze i jego podfolderach? 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 mogę uzyskać listę wszystkich plików w folderze i jego podfolderach?

Cześć Skrypciarzu! W jaki sposób mogę użyć skryptu, żeby pokazał mi wszystkie pliki w folderze? I w jaki sposób mogę tak zmodyfikować ten skrypt, żeby pokazywał mi również wszystkie pliki w podfolderach tego folderu?

-- CS

Cześć CS! Wczoraj pokazaliśmy wszystkim skrypt, który zmieniał pliki tylko do odczytu w pliki do odczytu i zapisu. Obiecaliśmy też, że w dzisiejszej rubryce wyjaśnimy, jak przede wszystkim udało nam się zdobyć listę wszystkich plików w folderze. Twoje pytanie jest wprost idealnym wprowadzeniem.

Zacznijmy od czegoś łatwego: skryptu, który po prostu podaje listę wszystkich plików w folderze. Skrypt ten podaje nazwy wszystkich plików znalezionych w folderze C:\Scripts:

Set objFSO = CreateObject("Scripting.FileSystemObject")

objStartFolder = "C:\Scripts"



Set objFolder = objFSO.GetFolder(objStartFolder)



Set colFiles = objFolder.Files

For Each objFile in colFiles

    Wscript.Echo objFile.Name

Next

Jak widzisz, to naprawdę nic wielkiego. Tworzymy wystąpienie FileSystemObject, a następnie używamy metody GetFolder, by połączyć się z folderem C:\Scripts. Proste. Gdybyśmy chcieli połączyć się z, dajmy na to, folderem Windows, musielibyśmy jedynie odpowiednio zmienić ścieżkę. Robimy to poprzez przypisanie objStartFolder innej wartości:

objStartFolder = "C:\Windows"

Kiedy już połączymy się z folderem, tworzymy odsyłacz do właściwości Pliki (Files), używając tej komendy:

Set colFiles = objFolder.Files

W odpowiedzi otrzymujemy kolekcję, zawierającą wszystkie pliki znalezione w folderze. (Jednakże – i ma to duże znaczenie dla Twojego drugiego pytania – kolekcja ta nie zawiera plików znalezionych w ewentualnych podfolderach C:\Scripts). W tym momencie cała reszta jest dziecinnie prosta: możemy teraz użyć pętli For Each (dla każdego), dzięki której – jeśli zechcemy – będziemy mogli wykonać jakąś operację na każdym z plików kolekcji. Pytałeś, jak uzyskać listę plików w folderze – tworzymy po prostu echo nazwy pliku. Możemy jednak zrobić o wiele więcej, na przykład, możemy uzyskać właściwość DateCreated (data utworzenia) lub właściwość Size (rozmiar). Dokładniejszy opis obiektu FileSystemObject oraz porady dotyczące użytkowania znajdziesz na stronie Script Runtime Primer (j.ang.) w Przewodniku po Skryptach Microsoft Windows 2000 (Microsoft Windows 2000 Scripting Guide). Innymi słowy, uzyskanie listy wszystkich plików w folderze jest trywialnie proste. Uzyskanie listy plików w folderze oraz wszystkich plików w podfolderach może już być trudniejsze. Potrzebujesz do tego skryptu cyklicznego.

Nie będziemy tu wyjaśniać zagadnienia cykliczności; po szczegóły odsyłamy do stosownego rozdziału w Microsoft Windows 2000 Scripting Guide (j.ang.) (fakt, robimy dziś tej książce niezłą reklamę). Ogólnie rzecz biorąc, funkcja cykliczna to funkcja, która potrafi automatycznie wywołać się dowolną ilość razy. Może nie brzmi to z początku sensownie, ale spójrzmy na to z tej strony: Skrypt, który pokazaliśmy powyżej, tworzy listę wszystkich plików w folderze, a następnie kończy działanie. Nieistotne, czy w folderze są jakieś podfoldery; skrypt nie zwraca na to uwagi.

Dla funkcji cyklicznej z kolei ma to znaczenie jak najbardziej: będzie ona działać tak długo, aż wykona wszystko, czego sobie od niej życzysz. Funkcja cykliczna utworzy listę wszystkich plików w folderze, a następnie sprawdzi, czy folder zawiera jakieś podfoldery. Załóżmy, że funkcja znajdzie podfoldery A i B. W takim wypadku funkcja wywoła się automatycznie i utworzy listę wszystkich plików w podfolderze A. Co jeśli w podfolderze A znajduje się pod-podfolder C? Żaden problem: funkcja wywoła się ponownie i wyświetli listę wszystkich plików w pod-podfolderze C. Proces ten będzie się powtarzać do momentu, gdy nie będzie już więcej podfolderów. W tym momencie funkcja cofa się i zaczyna działanie na podfolderze B. Co więcej, funkcja będzie posłusznie działać, dopóki nie sprawdzone zostaną wszystkie podfoldery, pod-podfoldery, pod-pod-podfoldery – cóż, dopóki wszystkie pliki co do jednego nie zostaną umieszczone na liście.

To wszystko wygląda na okropnie skomplikowane. I takie właśnie jest. Na szczęście jednak VBScript nie pokazuje Ci wszystkiego. Hej, czy moglibyśmy Cię co do tego oszukać? Spójrz, oto skrypt używający funkcji cyklicznej – ShowSubFolders – do tworzenia listy wszystkich plików w folderze C:\Scripts oraz wszystkich plików w ewentualnych podfolderach C:\Scripts:

Set objFSO = CreateObject("Scripting.FileSystemObject")

objStartFolder = "C:\Scripts"



Set objFolder = objFSO.GetFolder(objStartFolder)

Wscript.Echo objFolder.Path

Set colFiles = objFolder.Files

For Each objFile in colFiles

    Wscript.Echo objFile.Name

Next

Wscript.Echo



ShowSubfolders objFSO.GetFolder(objStartFolder)



Sub ShowSubFolders(Folder)

    For Each Subfolder in Folder.SubFolders

        Wscript.Echo Subfolder.Path

        Set objFolder = objFSO.GetFolder(Subfolder.Path)

        Set colFiles = objFolder.Files

        For Each objFile in colFiles

            Wscript.Echo objFile.Name

        Next

        Wscript.Echo

        ShowSubFolders Subfolder

    Next

End Sub

Jak widzisz, pierwsza część skryptu jest dokładnie taka sama, jak ta, którą widzieliśmy wcześniej (z jednym wyjątkiem: ten skrypt powtarza ścieżkę folderu, dzięki czemu wiemy, z którym folderem mamy do czynienia). Po ukazaniu wszystkich plików w C:\Scripts, skrypt wywołuje funkcję cykliczną ShowSubFolders. Funkcja zaczyna badać wszystkie podfoldery i podaje informację o wszystkich znalezionych plikach. Cała "cykliczność" odbywa się automatycznie; Twoim zadaniem jest tylko siedzieć i się przyglądać.

Jeśli nie rozumiesz w pełni, o co w tym wszystkim chodzi, nie przejmuj się; trochę potrwa, zanim się załapie, jak dokładnie działają funkcje cykliczne. A tymczasem po prostu skopiuj poprzedni skrypt i używaj go za każdym razem, gdy musisz zrobić coś ze wszystkimi plikami w folderze i jego podfolderach.

 Do początku strony Do początku strony


Centrum skryptów - Systemy operacyjne