Centrum skryptów - Systemy operacyjne

Jak sprawdzić ilość wolnego miejsca na 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.

Jak sprawdzić ilość wolnego miejsca na dysku?

Cześć Skrypciarze! Pytanie

Cześć Skrypciarze! Jak sprawdzić ilość wolnego miejsca na dysku (w procentach), na którym uruchomię skrypt?

-- GS

Cześć Skrypciarze! Odpowiedź

Cześć, GS! Widzę, że wzbudziłem prawdziwe zainteresowanie moim zeszłotygodniowym pytaniem „Do jakiego rzędu należą: czerwończyk dukacik, pokapek dwukropiaczek i fruczak gołąbek?”. Czy to było w tym tygodniu? Nie pamiętam. W każdym razie spróbuję raz jeszcze wzbudzić ciekawość:

„Kto otrzymał w tym roku nagrodę Nobla z literatury” (Dla śledzących nasze skrypciarskie poczynania odpowiedź na to pytanie to betka, wystarczy spojrzeć do zeszłotygodniowej edycji.)

Jeszcze jedno: „Jak ustalić wolne miejsce na dysku (w procentach), na którym uruchomi się dany skrypt?”

Oto odpowiedź:

strPath = Wscript.ScriptFullName

strDrive = Left(strPath, 2)



strComputer = "."



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



Set colDisks = objWMIService.ExecQuery _

    ("Select * From Win32_LogicalDisk Where DeviceID = '" & strDrive & "'")



For Each objDisk in colDisks

    intFreeSpace = objDisk.FreeSpace

    intTotalSpace = objDisk.Size

    pctFreeSpace = intFreeSpace / intTotalSpace

    Wscript.Echo FormatPercent(pctFreeSpace)

Next

Zaczynamy tu od przypisania wartości właściwości ScriptFullName do zmiennej strPath. ScriptFullName to oczywiście obiekt Wscript. Zauważcie przy tym, że nie musimy tworzyć oddzielnie wystąpienia obiektu Wscript; ten obiekt tworzony jest dla nas automatycznie za każdym razem, gdy uruchamiamy skrypt, który używa Windows Script Host.

ScriptFullName zwróci nam ścieżkę samego skryptu, będzie wyglądała pewnie następująco: D:\Scripts\My Scripts\Active Directory\Test.vbs. Wszystko pięknie, tyle że z całej tej ścieżki potrzebujemy jedynie litery dysku docelowego. Jak się pozbyć całego tego ogona, żeby została nam tylko litera D?

Pytanie skomplikowane o tyle, że sposobów jest wiele. Postaramy się jednak nie komplikować Ci życia, GS, i wybrać opcję najmniej skomplikowaną. Pierwsze dwa znaki w ścieżce to zawsze nazwa dysku i dwukropek (np. D:). Oznacza to, że możemy pobrać literę odpowiadającą dyskowi używając po prostu funkcji Left, która pobiera dwa pierwsze znaki ciągu:

strDrive = Left(strPath, 2)

Oczywiście pierwsze dwa wiersze można było „upchnąć” do jednego. Dałoby nam to podobny wiersz:

strDrive = Left(Wscript.ScriptFullName, 2)

W naszym skrypcie użyliśmy dwóch wierszy tylko dlatego, że są one bardziej czytelne dla naszej publiki i nie trzeba aż tyle objaśniać. Niestety trzeba objaśniać, dlaczego użyliśmy akurat dwóch wierszy, a nie jednego. Jak więc widać, na jedno wychodzi.

Teraz zostało nas tylko troje: ja, litera i dwukropek (uprzejmiej byłoby napisać: litera, dwukropek i ja). Jesteśmy więc już gotowi do obliczenia wolnego miejsca na dysku. Aby to uczynić, łączymy się z usługą WMI na komputerze lokalnym, a następnie używamy metody ExecQuery, która zwraca nam kolekcję wszystkich dysków, które mają identyfikator DeviceID (litera dysku) równy wartości zmiennej strDrive :

Set colDisks = objWMIService.ExecQuery _

    ("Select * From Win32_LogicalDisk Where DeviceID = '" & strDrive & "'")

Zwróćcie uwagę, co zrobiliśmy. W typowej kwerendzie WQL można wpisywać z klawiatury, w następujący sposób:

"Select * From Win32_LogicalDisk Where DeviceID = 'C:'"

Zamiast jednak wpisywać z klawiatury, radzimy co następuje:

Po pierwszym cudzysłowie w naszej kwerendzie WQL umieściliśmy podwójny cudzysłów. Oznacza to, że ciąg ma się kończyć w tym momencie:

"Select * From Win32_LogicalDisk Where DeviceID = '"

Następnie usunęliśmy wpisaną z klawiatury literę (C:) i zastąpiliśmy ją handlowego „i” (czyli znakiem „&”), zmienną strDrive oraz drugim znakiem handlowego „i”:

"Select * From Win32_LogicalDisk Where DeviceID = '" & strDrive &

Jak widać, połączonych jest tu kilka ciągów; mamy ciąg Select * From Win32_LogicalDisk Where DeviceID = ' oraz ciąg strDrive. Co zaś tyczy się znaczka „&”, to wiecie zapewne, że to właśnie on używany jest do łączenia ciągów.

Musimy jeszcze dodać drugi cudzysłów, ponieważ wartość zmiennej strDrive to ciąg (co oznacza, że wartość powinna być ujęta w pojedynczym cudzysłowie). W tym celu wstawiamy podwójny cudzysłów (aby zaznaczyć, że zaczynamy nowy ciąg), następnie dodajemy drugi pojedynczy cudzysłów oraz zamykający zestaw podwójnych cudzysłowów. Trochę skomplikowany ten opis, ale spójrzcie na poniższy wiersz:

"Select * From Win32_LogicalDisk Where DeviceID = '" & strDrive & "'"

Innymi słowy, aby zastąpić wartość ciągu wpisywaną z klawiatury, po prostu użyliśmy komendy " & strDrive & ":

"Select * From Win32_LogicalDisk Where DeviceID = 'C:'

"Select * From Win32_LogicalDisk Where DeviceID = '" & strDrive & "'"

Po wpisaniu kwerendy wracamy do naszej kolekcji dysków na komputerze, które mają literę odpowiadającą dyskowi równą D:; z uwagi na to, że na komputerze litery te nie mogą się powtarzać, oznacza to, że w naszej kolekcji będzie tylko jeden element. Oznacza to także, że możemy już obliczyć procentową pojemność wolnego obszaru na dysku. Robimy to, uruchamiając pętlę For Each, która przechodzi przez wszystkie elementy w naszej jednoelementowej kolekcji, a następnie uruchamiamy następujący fragment kodu:

intFreeSpace = objDisk.FreeSpace

intTotalSpace = objDisk.Size

pctFreeSpace = intFreeSpace / intTotalSpace

Wscript.Echo FormatPercent(pctFreeSpace)

Co najlepszego uczyniliśmy? W sumie wszystko, co najlepszego można było uczynić, więc bez wyrzutów.

Już tłumaczę. Najpierw bierzemy wartość właściwości FreeSpace i przechowujemy ją w zmiennej intFreeSpace; jak sama nazwa wskazuje właściwość FreeSpace (wolna przestrzeń – ang.) pokazuje nam wolną ilość bajtów na dysku. Następnie bierzemy wartość właściwości Size i przechowujemy tę wartość w zmiennej intTotalSpace; właściwość Size zwraca całkowitą pojemność dysku w bajtach. Teraz, w celu obliczenia procentowej zawartości wolnego miejsca na dysku, dzielimy dostępne bajty przez całkowitą pojemność dysku:

pctFreeSpace = intFreeSpace / intTotalSpace

Powinno dać nam to podobną wielkość:

0.138232508084972

Hmmm… Macie rację, nie wygląda nam to na procenty. Bez paniki, kontrolujemy sytuację. Właśnie dlatego nie wywołaliśmy tak od razu echa intFreeSpace / intTotalSpace, ale przechowaliśmy wartość w zmiennej pctFreeSpace. To z kolei wyjaśnia dlaczego skorzystaliśmy z funkcji FormatPercent – właśnie tak, aby przekonwertować tę wartość na procenty:

13.82%

Teraz już chyba bezsprzecznie wygląda to na procenty.

Co zrobić, jeżeli Waszym hobby nie jest akurat stukanie na klawiaturze? Żaden problem, wszystkie te cztery wiersze kodu można skompresować do pojedynczego wiersza:

Wscript.Echo FormatPercent(objDisk.FreeSpace / objDisk.Size)

W naszym skrypcie użyliśmy pierwotnie czterech, aby wyjaśnić wszystko krok po kroku. Działanie jest jednak to samo. Dwie polopiryny, lub jedna polopiryna plus. Jak kto woli.

Mamy nadzieję, ze to odpowiada na Twoje pytania.

Prosimy tylko nie zadawać tendencyjnych…

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne