Centrum skryptów - Systemy operacyjne

Jak wyświetlić listę wszystkich folderów, których nazwa zaczyna się od określonej wartości ciągu?

Udostępnij na: Facebook

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 wyświetlić listę wszystkich folderów, których nazwa zaczyna się od określonej wartości ciągu?

Cześć Skrypciarze! Jak znaleźć wszystkie foldery, których nazwa zaczyna się od określonego ciągu? Chciałbym np. aby podać ciąg 123, co spowodowałoby odnalezienie folderów z zakresu od 123000 do 123999.

-- MD

Cześć, MD. Wiecie zapewne, że u nas w USA cały czas toczy się walka o to, kto będzie kandydował na prezydenta (nie mówiąc już o tym, kto naprawdę zostanie prezydentem. Od tego dzieli nas jeszcze kilka miesięcy). Wspominam o tym ponieważ, pod koniec Zimowej Olimpiady Skrypciarskiej 2008 otrzymaliśmy wiadomość e-mail kończącą się tym oto hasłem: „Dr Scripto na prezydenta”.

O ile wiemy, dr Scripto nie ma w planach kandydować na prezydenta; nawet gdyby tak było, Skrypciarze stanowczo by mu to odradzali. Nikt nie lubi dra Scripto bardziej niż my. Niemniej jednak nie tylko uważamy, że nie nadaje się na prezydenta. Uważamy, że nie nadaje się nawet na kandydata na prezydenta. Wierzcie nam: w USA każdy uważa, że nadaje się na kandydata na prezydenta.

Dlaczego więc tak nie wierzymy w kwalifikacje dr Scripto na prezydenta? Mamy ku temu kilka powodów:

  • Dr Scripto nie jest prawdziwą osobą. Wiem, że wiele osób twierdzi to samo na temat byłego prezydenta Williama Howarda Tafta. Ale jednak…
  • Dr Scripto nie funkcjonuje we właściwym wymiarze. W najlepszym wypadku można powiedzieć, że jest dwuwymiarowy (cóż, jeżeli nie liczyć jego wielkiej głowy). Chyba ją jednak policzymy, biorąc pod uwagę, że wiele osób uważa, że James Buchanan to były prezydent USA. Jeżeli policzy się jedną wielką głowę, trzeba potem liczyć wszystkie).
  • Dr Scripto nie ma własnych pomysłów. Ma za to do dyspozycji cały zespół specjalistów, którzy przedstawiają za pomocą skryptów każdą jego wypowiedź.
  • Dr Scripto jest znany z tego, że jest znany. Nigdy nie zrobił nic niezwykłego.
  • Dr Scripto – hmmm, wiecie co? Może jednak byłby dobrym kandydatem na prezydenta.

Trzeba przyznać, że wypada dodać, że jedyną rzeczą, która stawia dr Scripto ponad wszystkimi kandydatami jest gotowość stawienia czoła trudnym (i często kontrowersyjnym) sprawom. Niech inni kandydaci rozwodzą się na temat ekonomii, polityki zagranicznej, prawa do aborcji i innymi błahostkami. Kiedy oni unikają sposób ważniejszych spaw życia codziennego, dr Scripto zajmuje się nimi od razu. Czy Barack Obama powie Wam, jak napisać skrypt, który utworzy listę wszystkich podfolderów, których nazwa zaczyna się od określonej wartości ciągu? Nie wydaje mi się. Pan Obama jest wyjątkowo milczący, jeżeli chodzi o tę kwestię. W przeciwieństwie do dra Scripto:

strComputer = "."



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



Set colFolders = objWMIService.ExecQuery _

    ("Select * from Win32_Directory Where FileName LIKE 'script%'")



For Each objFolder in colFolders

    Wscript.Echo objFolder.Name

Next

Na początek muszę zauważyć, że temu skryptowi towarzyszy jedno ważne zastrzeżenie: musi zostać uruchomiony w systemie Windows XP lub nowszym, niestety nie zadziała w systemie Windows 2000. Dlaczego? Ponieważ w kwerendzie WMI zastosowaliśmy operator LIKE, Który umożliwi nam wykonanie wyszukiwania z użyciem symboli wieloznacznych. Nie można uruchomić tego skryptu w systemie Windows 2000 z jednego, prostego powodu: System Windows 2000 nie obsługuje operatora LIKE.

Czy to oznacza, że użytkownicy systemu Windows 2000 odejdą z niczym? Niezupełnie. Jako alternatywa do stosowania operatora LIKE można po prostu pobrać kolekcję wszystkich folderów znajdujących się na komputerze, a następnie sprawdzić, czy w poszczególnych folderach na początku nazwy pojawia się wartość ciągu script (czyli pierwsze sześć znaków). Można to zrobić za pomocą poniższego skryptu.

strComputer = "."



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



Set colFolders = objWMIService.ExecQuery _

    ("Select * from Win32_Directory")



For Each objFolder in colFolders

    If Left(objFolder.FileName, 6) = "script" Then

        Wscript.Echo objFolder.Name

    End If

Next

Uwaga. Tam, można uruchomić ten skrypt na komputerze zdalnym. Wystarczy przypisać nazwę tego zdalnego komputera do zmiennej o nazwie strComputer, w ten oto sposób:

strComputer = "atl-fs-001"

Po połączeniu się z usługą WMI używamy poniższego wiersza kodu w celu pobrania kolekcji wszystkich folderów zaczynających się od znaków script:

Set colFolders = objWMIService.ExecQuery _

    ("Select * from Win32_Directory Where FileName LIKE 'script%'")

To nie jest zbyt skomplikowane; chcemy tylko uzyskać wszystkie wystąpienia klasy Win32_Directory, w których wartość właściwości FileName (nazwa folderu) jest „podobna” do scripts%. Jest to po prostu sposób wykonania wyszukiwania z użyciem symboli wieloznacznych w usłudze WMI: używamy operatora LIKE oraz znaku procentu jako symbolu wieloznacznego. Załóżmy, że użyliśmy polecenia DIR z wiersza polecenia i chcieliśmy uzyskać listę plików zaczynających się od liter script. W takim wypadku użylibyśmy tego polecenia:

dir script*

W usłudze WMI wykonujemy to samo, tylko zamiast znaku gwiazdki używamy znaku procentu.

Uwaga. Dobre pytanie: tak, można wyszukać nazwy folderów, które kończą się znakami script. W tym celu należy zastosować następującą składnię: Where FileName LIKE '%script'. Aby wyszukać nazwy folderów, które zawierają znaki script, należy zastosować następującą składnię: Where FileName LIKE '%script%'.

Po wykonaniu kwerendy uruchamiamy pętlę For Each, która przejdzie przez wszystkie foldery w pobranej kolekcji:

For Each objFolder in colFolders

Wewnątrz tej pętli wywołujemy echo wartości Name folderu (określanej często jako ścieżki folderu):

Wscript.Echo objFolder.Name

Dzięki temu otrzymamy następujący wynik:

c:\program files\gpmc\scripts

c:\program files\log parser 2.2\samples\scripts

c:\program files\microsoft platform sdk\samples\sysmgmt\msi\scripts

c:\program files\powershell community extensions\scripts

c:\program files\specopssoft\specops command\admin tools\scripts

c:\scripts

c:\windows\pchealth\helpctr\system\scripts

c:\windows\pchealth\helpctr\system_oem\modem\script

c:\windows\pchealth\helpctr\system_oem\scripts

Innymi słowy mamy wszystkie foldery, których nazwy (nie ścieżki, ale rzeczywiste nazwy folderów) zaczynają się od script.

Według ostatniej konfiguracji nasz skrypt przeszuka cały twardy dysk, szukając folderów, których nazwa zaczyna się od ciągu script. To może jest zbędna informacja, a ponadto może spowodować, że skrypt będzie działał wolniej niż byśmy chcieli. Ale to nie szkodzi. Możemy przyspieszyć działanie wzmacniając kwerendę WMI. Załóżmy przykładowo, że interesują nas tylko foldery znajdujące się na dysku C:. W takim wypadku możemy dodać do kwerendy drugą klauzulę, która ogranicza pobierane dane do folderów mających wartość właściwości Drive równą C:

Set colFolders = objWMIService.ExecQuery _

    ("Select * from Win32_Directory Where FileName LIKE 'script%' AND Drive = 'C:' ")

Alternatywnie można wyszukać foldery znajdujące się na dysku C oraz będące podfolderami folderu Documents and Settings. Niech i tak będzie. W tym celu dodajemy trzecią klauzulę Where, która ograniczy pobierane dane do folderów mających wartość właściwości Path (odpowiadającej regularnej ścieżce pliku minus litera dysku) równą \\documents and settings\\:

Set colFolders = objWMIService.ExecQuery _

    ("Select * from Win32_Directory Where FileName LIKE 'script%' AND Drive = 'C:' " _

        & "AND Path LIKE '\\documents and settings\\%'")
Uwaga. Tak, \\documents and settings\\: wygląda trochę dziwnie, nieprawdaż? Jednakże ponieważ znak \ jest znakiem zarezerwowanym w usłudze WMI, musi zostać „anulowany” (poprzedzony kolejnym znakiem \) za każdym razem, gdy używamy kwerendę WQL. W ten sposób ścieżka \documents and settings\ otrzyma następujący wygląd: \\documents and settings\\.

I mamy, co chcieliśmy.

To wszystko na dzisiaj MD. Teraz muszę odbyć poważną rozmowę z dr Scripto na temat możliwego kandydowania na prezydenta. Jak już zresztą mówiłem, Skrypciarze są w tej kwestii sceptycznie nastawieni.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne