Centrum skryptów - Systemy operacyjne

Jak zmienić plik tylko do odczytu (Read-only) w plik do odczytu i zapisu (Read-write)? 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 zmienić plik tylko do odczytu (Read-only) w plik do odczytu i zapisu (Read-write)?

Cześć Skrypciarze! Jak mogę zmienić plik tylko do odczytu (read-only) w plik do odczytu i zapisu (read-write)?

-- WR

Cześć WR! Nie chcemy, żebyś przeżył szok, ale wiesz w jaki sposób można zmienić plik tylko do odczytu w plik do odczytu i zapisu? Oczywiście używając skryptu!

Wiemy: tego się nie spodziewałeś, co?

Prawdę mówiąc, możesz użyć tego skryptu, który zmienia plik C:\Scripts\Test.vbs z pliku tylko do odczytu w plik do odczytu i zapisu:

Const ReadOnly = 1



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.GetFile("C:\Scripts\Test.vbs")



If objFile.Attributes AND ReadOnly Then

    objFile.Attributes = objFile.Attributes XOR ReadOnly

End If

Racja: może jednak powinniśmy wyjaśnić, o co w tym wszystkim chodzi. Zaczynamy od ustawienia wartości stałej ReadOnly 1 (więcej o tym za chwilę). Następnie tworzymy wystąpienie FileSystemObject i używamy metody GetFile, by połączyć się z plikiem C:\Scripts\Test.vbs. Jak dotąd nieźle.

W tym miejscu zaczyna się robić nieco dziwnie. Atrybut Read-only (Tylko do odczytu) jest przechowywany jako część "maski bitowej" wraz z innymi atrybutami plików, takimi jak Hidden (wartość 2, która określa, czy plik jest ukryty) i System (wartość 4, która określa, czy plik jest plikiem systemowym). W masce bitowej (luźno określanej jako zbiór atrybutów, przechowywanych jako pojedyncza wartość) indywidualne atrybuty można porównać do przełączników, które mogą być włączone lub nie. Jeśli przełącznik z wartością 1 jest włączony, wówczas plik jest tylko do odczytu; jeśli ten przełącznik jest wyłączony, to mamy plik do odczytu i zapisu.

Pozostaje jedno pytanie: jak u diabła sprawdzić, czy przełącznik jest włączony, czy nie. Dokładne wyjaśnienie wykraczałoby znacznie poza obszar tej rubryki. Pokrótce mówiąc, wystarczy użyć bitowego operatora AND ("i"). Zwróć uwagę na ten osobliwy wiersz w skrypcie:

If objFile.Attributes AND ReadOnly Then

Możesz wierzyć lub nie, ale ten wiersz sprawdza, czy atrybut ReadOnly (z wartością 1) jest aktywny. A gdybyśmy chcieli sprawdzić, czy plik jest ukryty? Cóż, w tym wypadku (zakładając, że ustawiliśmy wartość stałej Hidden jako 2) użylibyśmy takiej linii kodu:

If objFile.Attributes AND Hidden Then

Ogólnie rzecz biorąc, operator AND można odczytać w taki sposób: "Jeśli patrzymy na atrybuty pliku i jeśli przełącznik ReadOnly jest włączony, to jest to plik tylko do odczytu, a to stwierdzenie jest prawdziwe. Jeśli przełącznik ReadOnly jest wyłączony, wtedy to stwierdzenie jest fałszywe". Doświadczeni skrypciarze mogą się trochę krzywić na to wyjaśnienie, ale daje ono jakieś pojęcie o tym, jak to działa.

Ale po co właściwie sprawdzamy, czy plik jest tylko do odczytu? Cóż, za moment użyjemy operatora XOR, by przestawić przełącznik; do tego właśnie służy ta linia kodu:

objFile.Attributes = objFile.Attributes XOR ReadOnly

W tym przykładzie XOR po prostu przestawia plik z jednego stanu w drugi. Jeśli plik jest tylko do odczytu, XOR zmieni go w plik do odczytu i zapisu; jeśli jest to plik do odczytu i zapisu, XOR zmienia go w plik tylko do odczytu. Dlatego właśnie najpierw sprawdzamy, czy plik już jest tylko do odczytu. Jeśli tak, chcemy przestawić przełącznik i zmienić go w plik do odczytu i zapisu. Jeśli jednak plik jest plikiem do odczytu i zapisu, wówczas naturalnie nie chcemy go zmieniać; bądź co bądź uzyskalibyśmy w ten sposób plik tylko do odczytu. (Pamiętajmy, że tylko przestawiamy z jednego stanu w drugi.)

Racja: cała ta bitowa gadanina jest nieco dezorientująca, jesteśmy Ci winni rekompensatę. Dlatego poniżej masz skrypt, który łączy się z folderem C:\Scripts i zmienia wszystkie pliki tylko do odczytu w pliki do odczytu i zapisu. Nie będziemy tu wyjaśniać, w jaki sposób skrypt uzyskuje listę wszystkich plików w folderze; wrócimy do tego w jutrzejszej rubryce (taki mały podstęp, żeby przykuć uwagę czytelników). A na razie odbierz swoją rekompensatę:

Const ReadOnly = 1



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFolder = objFSO.GetFolder("C:\Scripts")

Set colFiles = objFolder.Files



For Each objFile in colFiles

    If objFile.Attributes AND ReadOnly Then

        objFile.Attributes = objFile.Attributes XOR ReadOnly

    End If

Next

To do zobaczenia jutro, co?

 Do początku strony Do początku strony


Centrum skryptów - Systemy operacyjne