Centrum skryptów - Systemy operacyjne

Jak określić, czy liczba plików w serii folderów przekracza określoną wartość?

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 określić, czy liczba plików w serii folderów przekracza określoną wartość?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak określić, czy liczba plików w serii folderów przekracza określoną wartość?

-- DP

Cześć Skrypciarze! Odpowiedź

Cześć, DP. Buongiorno. Le come sta? Tutto bene?

Co to wszystko znaczy? Io non so; Io non parlo Italiano. Innymi słowy: Nie wiem, nie mówię po włosku.

Ale tak naprawdę: „Io non so; Io non parlo Italiano” znaczy: „Nie wiem, nie mówię po włosku”. Pierwsze zdanie może zostać przetłumaczone (przynajmniej przez nas): „Dzień dobry. Jak się masz? Wszystko OK?”

Skąd to nagłe zainteresowanie językiem włoskim? Cóż, w czasie, kiedy czytacie ten artykuł, ja szykuję się na wyprawę do Włoch, 10-dniowe wakacje w Rzymie i Wenecji. Kilka lat temu zdecydowałem się ma towarzyszenie kilku członkom mojej rodziny w podróży do Londynu i Paryża. Fajnie było, ale kompletnie niemożliwym było dogodzenie wszystkim i wieczne dyskusje na temat tego, dokąd pójść, a dokąd nie pójść i dokąd pójść najpierw, były strasznie wyczerpujące.

„Fajnie było.” – tyle mogłem stwierdzić – „Nigdy więcej nie dam się na coś takiego namówić.”

A teraz, no cóż, znowu dałem się namówić. I przy okazji próbuję się nauczyć kilku słów po włosku, wolałbym nie wyglądać jak zdezorientowany amerykański turysta. (Oczywiście jestem takim amerykańskim turystą, ale po prostu nie chcę na takiego wyglądać.)

Tak naprawdę miałem nadzieję napisać cały dzisiejszy artykuł po włosku, ale jak się okazuje, w moich rozmówkach włoskich, które znalazłem w księgarni, nie ma odpowiednika zdania „Stosujemy kwerendę Associators Of w celu pobrania kolekcji wszystkich podfolderów w określonym folderze”. Ale chyba wyjdzie nam to na dobre, ta rubryka jest czasem trudna do zrozumienia w języku ojczystym, nie chcemy nikomu utrudniać życia.

A zatem oto skrypt rozwiązujący nasz problem:

strComputer = "."



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



Set colSubfolders = objWMIService.ExecQuery _

    ("Associators of {Win32_Directory.Name='C:\Absentee Reports'} " _

        & "Where AssocClass = Win32_Subdirectory " _

            & "ResultRole = PartComponent")



For Each objFolder in colSubfolders

    Set colFiles = objWMIService.ExecQuery _

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

            & "ResultClass = CIM_DataFile")



    If colFiles.Count => 4 Then 

        Select Case colFiles.Count

            Case 4

                Wscript.Echo objFolder.Name & " has 4 files in it."

            Case 5

                Wscript.Echo objFolder.Name & " has 5 files in it."

            Case 6

                Wscript.Echo objFolder.Name & " has 6 files in it."

            Case 7

                Wscript.Echo objFolder.Name & " has 7 files in it."

            Case 8

                Wscript.Echo objFolder.Name & " has 8 files in it."

        End Select

    End If

Next

Jak widzimy, zaczynamy od połączenia się z usługą WMI na lokalnym komputerze. Nie ma się co martwić, skrypt sprawdza się doskonale również w przypadku zdalnego komputera. W tym celu należy przypisać nazwę komputera do zmiennej strComputer, w taki oto sposób:

strComputer = "atl-fs-01"

Według DP, jeden z serwerów zawiera folder (w naszym przypadku C:\Absentee Reports), który z kolei zawiera podfolder dla każdego pracownika w organizacji. Innymi słowy, strukturę folderów podobną do poniższej:

C:\Absentee Reports

C:\Absentee Reports\Gail Erickson

C:\Absentee Reports\Jonathan Hass

C:\Absentee Reports\Ken Myer

C:\Absentee Reports\Pilar Ackerman

Za każdym razem, gdy pracownika nie ma w pracy, do odpowiedniego podfolderu dodawany jest odpowiedni podfolder. Jeżeli na przykład nieobecny jest Ken Meyer, nowy dokument zostaje dodany do podfolderu C:\Absentee Reports\Ken Myer. To, co my musimy zrobić, to zajrzeć do każdego podfolderu, policzyć liczbę dokumentów w każdym z nich, a następnie odpowiedni do liczby zareagować. Dobra pytanie: jak to wszystko zrobić?

No cóż, na początku stosujemy poniższy wiesz kodu w celu pobrania kolekcji wszystkich podfolderów znajdujących się w folderze C:\Absentee Reports:

Set colSubfolders = objWMIService.ExecQuery _

    ("Associators of {Win32_Directory.Name='C:\Absentee Reports'} " _

        & "Where AssocClass = Win32_Subdirectory " _

            & "ResultRole = PartComponent")

O nie, to nie jest język włoski; włoski – nawet mój włoski – miałby więcej sensu. Natomiast ten dziwnie wyglądający kod to kwerenda Associators Of, która po prostu ma tak wyglądać. Ale nie musicie przejmować się szczegółami; zauważcie jedynie, że pobieramy kolekcję podfolderów (wystąpień klasy Win32_Subdirectory) dla folderu macierzystego C:\Absentee Reports. Zauważcie także, że dzięki niej potrzymamy tylko podfolfdery z „górnego poziomu”; jeżeli macie zagnieżdżone podfolder (podfolder znajdujące się w podfolderach), to trzeba będzie zastosować inne podejście w celu pobrania wszystkich podfolderów i podpodfolderów.

Wysyłamy więc naszą kwerendę i otrzymujemy kolekcję wszystkich podfolderów znajdujących się w C:\Absentee Reports, a naszym następnym posunięciem jest ustawienie pętli For Each, która przejdzie przez wszystkie foldery znajdujące się w tej kolekcji. Pierwszą czynnością, którą wykonamy wewnątrz tej pętli, jest wysłanie następnej kwerendy, tym razem takiej, dzięki której otrzymamy kolekcję zawierającą wszystkie pliki znajdujące się w pierwszym podfolderze:

Set colFiles = objWMIService.ExecQuery _

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

        & "ResultClass = CIM_DataFile")

Właśnie tak, kolejna zwariowana (pazzesco) kwerenda Associators Of. Ale załóżmy, że pierwszym podfolderem w naszej kolekcji jest folder o nazwie Gail Ericsson; oznacza to, że właściwość Name folderu (coś, co zazwyczaj określamy jako ścieżkę dostępu pliku) ma wartość C:\Absentee Reports\Gail Erickson. Oznacza to, że kwerenda Associators Of szuka wszystkich wystąpień klasy CIM_DataFile powiązanych (zachowanych ) z folderem C:\Absentee Reports\Gail Erickson (reprezentowanym przez zmienną objFolder.Name). Innymi słowy, łączymy się z folderem C:\Absentee Reports\Gail Erickson i pobieramy kolekcję wszystkich plików (plików będących wystąpieniami klasy CIM_DataFile) które się tam znajdują.

Reszta jest prosta (facile). Wszystkie kolekcje WMI mają właściwość (Count), dzięki której znamy liczbę elementów znajdujących się w danej kolekcji. Wykonywane przez nas czynności zależą od tego, czy folder zawiera 4, 5, 6, 7, lub 8 plików; jeżeli folder zawiera mniej niż 4 pliki, nie robimy zupełnie nic. Z tego powodu, gdy tylko otrzymamy kolekcję, sprawdzamy wartość właściwości Count w celu stwierdzenia, czy jej wartość jest równa lub większa niż 4:

If colFiles.Count => 4 Then

Jeżeli tak, ustawiamy zdanie Select Case na podstawie wartości właściwości Count:

Select Case colFiles.Count

    Case 4

        Wscript.Echo objFolder.Name & " has 4 files in it."

    Case 5

        Wscript.Echo objFolder.Name & " has 5 files in it."

    Case 6

        Wscript.Echo objFolder.Name & " has 6 files in it."

    Case 7

        Wscript.Echo objFolder.Name & " has 7 files in it."

    Case 8

        Wscript.Echo objFolder.Name & " has 8 files in it."

    Case Else

        Wscript.Echo objFolder.Name & " has more than 8 files in it."

End Select

Jak widać, nie dzieje się tu nic szczególnego. Jeżeli, na przykład, właściwość Count ma wartość równą 4, wywołujemy echo komunikatu mówiącego o tym, że folder zawiera 4 pliki. Nie jest to zbyt ekscytujące, ale nie o to nam chodzi; chodzi natomiast o to, żeby pokazać, jak określić liczbę plików znajdujących się w folderze, a następnie wykonać określoną czynność w zależności od liczby plików. Oczywiście, jeżeli chcecie czegoś bardziej ekscytującego (i może bardziej konkretnego), wystarczy zastąpić nasz przykładowy kod czymś bardziej ekscytującym (no i bardziej konkretnym).

Teraz po prostu kontynuujemy działanie pętli i powtarzamy ten proces dla następnego podfolderu w kolekcji. Kiedy już wykonamy wszystkie czynności, otrzymujemy raport podobny do następującego:

C:\Scripts\Ken Myer has 6 files in it.

C:\Scripts\Pilar Ackerman has 6 files in it.

W tym momencie to już wszystko (fatto).

Mam nadzieję, że odpowiedz na pytanie jest zadowalająca. Chciałbym zostać jeszcze chwilę i pozagłębiać się w szczegóły, ale czas już na mnie, muszę jechać na lotnisko (aeroporto). Ale nie martwcie się, nawet na wakacjach będę pisać nowe artykuły rubryki Cześć Skrypciarze. Jak to możliwe? To proste: po prostu jestem taki… - hmmmmm…

Teraz, kiedy o tym myślę, nie wydaje mi się to takie astuto (sprytne).

Jakby to już dawno temu powiedział mój syn (nie mówiąc już o Redaktorce)

No cóż; que sera sera. Arrivederci!

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne