Centrum Skryptów - Systemy Operacyjne

W jaki sposób określić kolejną dostępną literę dysku? 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.

W jaki sposób określić kolejną dostępną literę dysku?

Cześć Skrypciarze! W jaki sposób określić kolejną dostępną literę dysku?

-- TW

Cześć TW. To ciekawe pytanie, które pojawia się od czasu do czasu. Kiedyś było łatwiej: wszyscy użytkownicy mieli tylko dyski A, B i C i nie trzeba było wielkiego wysiłku, żeby zgadnąć, że każda inna litera będzie dostępna. Dzisiaj niestety wygląda to inaczej: wraz z rozrostem sieci zwiększa się liczba mapowanych dysków, mnożą się napędy CD i DVD, napędy USB, przenośne twarde dyski i inne urządzenia. To wszystko powoduje, że liczba dysków i napędów w komputerze prawie na pewno wykracza poza trójkę A, B i C. Jak zatem określić w tym alfabetycznym bigosie, które litery dysków są dostępne, a które nie?

Tak naprawdę jest to prostsze niż Wam się wydaje. Zacznijmy od tego, że do dyspozycji mamy tylko 23 litery; A, B i C odpadają (A i B są oczywiście zarezerwowane dla stacji dyskietek, a główny twardy dysk na komputerze zawsze będzie oznaczony literą C). Szukanie kolejnej dostępnej litery możemy zacząć od napędu D, przechodząc do napędu E, napędu F i tak dalej, dopóki nie znajdziemy dostępnej litery albo nie dotrzemy do Z.

Musimy oczywiście wiedzieć, jakie litery są używane przez komputer. Na szczęście jest to bardzo proste: możemy otrzymać kolekcję znajdujących się w użyciu liter dzięki klasie Win32_LogicalDisk i sprawdzeniu właściwości DeviceID. Innymi słowy:

strComputer = "."

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



Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")



For Each objDisk in colDisks

    Wscript.Echo objDisk.DeviceID

Next

Otrzymamy coś takiego:

C:

D:

E:

G:

Z:

Możemy oczywiście przejrzeć te dane i bez większego trudu określić kolejną dostępną literę dysku. Po co jednak mamy się w ogóle wysilać? Przecież mowa była o określaniu dostępnych liter przy pomocy skryptu, czyż nie?

A jakże. Oto skrypt, który określi kolejną dostępną literę dysku na komputerze. Przyjrzyjmy mu się, a za chwilę wyjaśnimy jego działanie:

Set objDictionary = CreateObject("Scripting.Dictionary")



strComputer = "."

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



Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")



For Each objDisk in colDisks

    objDictionary.Add objDisk.DeviceID, objDisk.DeviceID

Next



For i = 67 to 90

    strDrive = Chr(i) & ":"

    If objDictionary.Exists(strDrive) Then

    Else

        Wscript.Echo strDrive & " is the next available drive letter."

        Wscript.Quit

    End If

Next

Wscript.Echo "There are no available drive letters on this computer.”

Zaczynamy od utworzenia wystąpienia obiektu Dictionary (słownik), który ułatwia przechowywanie danych w pamięci oraz – co równie ważne – pomaga w określeniu, które dane są przechowane w pamięci, a które nie. (Więcej szczegółów dotyczących obiektu Dictionary znajdziecie w artykule w jęz. angielskim Scripting Runtime Primer w Przewodniku Skryptowania Microsoft Windows 2000).

Następnie przy pomocy klasy Win32_LogicalDisk pobieramy listę wszystkich liter dysków (DeviceID) używanych obecnie przez komputer. Nie będziemy wywoływać echa tej informacji na ekran; zamiast tego przechowamy ją w obiekcie Dictionary. Służy do tego poniższa linia kodu:

objDictionary.Add objDisk.DeviceID, objDisk.DeviceID

W słowniku elementy składają się z dwóch części: klucza i obiektu. W tym konkretnym skrypcie tak naprawdę potrzebujemy tylko klucza (który pozwala nam łatwo określić, czy dana informacja znajduje się w słowniku), jednakże obiekt Dictionary wymaga obydwu części. Dlatego też ustawiamy zarówno klucz, jak i element, na literę dysku. Stąd identyczne parametry objDisk.DeviceID, przekazane do metody Add (dodaj).

Kiedy skrypt zakończy swoją pętlę przez kolekcję liter dysków, otrzymamy słownik składający się z następujących kluczy (oraz obiektów):

C:

D:

E:

G:

Z:

Gdy już otrzymamy listę wszystkich liter dysków obecnie używanych przez komputer, pozostaje nam już tylko znalezienie następnej dostępnej litery. Zajmuje się tym poniższy blok kodu:

For i = 67 to 90

    strDrive = Chr(i) & ":"

    If objDictionary.Exists(strDrive) Then

    Else

        Wscript.Echo strDrive & " is the next available drive letter."

        Wscript.Quit

    End If

Next

Wscript.Echo "There are no available drive letters on this computer."

Bez obaw, wszystko wyjaśnimy. Jak wspomnieliśmy wcześniej, musimy sprawdzić litery od D do Z, aby zobaczyć, które z nich można zmapować. Najprostszym sposobem jest utworzenie pętli For Next (dla następnego) i puszczenie jej przez wartości ASCII tych liter. Jak się okazuje, wartość ASCII dla pisanego wielką literą D wynosi 67, a dla Z wartość ta wynosi 90. Tym samym pętla For Next działa w przedziale od 67 do 90:

For i = 67 to 90

Wartości ASCII są idealne dla pętli For Next, ale niezbyt przydatne przy mapowaniu dysków (niewiele komputerów ma dysk 81 :). Dlatego też w następnej linii kodu używamy funkcji Chr, aby przekonwertować wartość ASCII na literowy odpowiednik. Funkcja Chr przekonwertuje tę wartość (67) na wielkie D. Dostawiamy dwukropek i w zmiennej strDrive znajdzie się wartość D:, która aż za bardzo przypomina literę dysku.

Reszta to bułka z masłem. (Zakładając oczywiście, że znacie się trochę na VBScript). Przy pomocy metody Exist obiektu Dictionary sprawdzamy, czy pierwsza litera dysku - D: - znajduje się w słowniku. Przypominamy, że słownik zawiera wszystkie niedostępne litery dysków. Jeśli D: znajduje się w słowniku, oznacza to, że litera ta jest już używana przez dysk. W takim wypadku pętla uruchamia się ponownie i sprawdza następną literę dysku (E:).

A jeśli znajdziemy literę, której nie ma w słowniku? Cóż, to znaczy, że możemy jej użyć. Wykonujemy wówczas dwie czynności. Po pierwsze, wywołujemy echo wiadomości informującej o tym, że ta litera jest dostępna. Po drugie, opuszczamy skrypt przy pomocy metody Quit (wyjdź). Dlaczego kończymy działanie skryptu w tym momencie? Znaleźliśmy to, czego szukaliśmy, czyli kolejną dostępną literę dysku. Nie ma sensu dalej sprawdzać liter.

Co jeśli nie ma żadnej dostępnej litery? W takim wypadku opuszczamy pętlę For Next i uruchamiamy ostatni wiersz skryptu, który powie nam po prostu, że nie ma dostępnych liter dysków. Ponieważ kończymy działanie skryptu jak tylko znaleziona zostanie dostępna litera, ta linia kodu zadziała tylko wtedy, gdy poszukiwanie dostępnej litery się nie powiedzie.

 Do początku strony Do początku strony


Centrum Skryptów - Systemy Operacyjne