Centrum Skryptów - Systemy operacyjne

W jaki sposób przerobić plik tylko do odczytu na plik do zapisu? 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 przerobić plik tylko do odczytu na plik do zapisu?

Cześć Skrypciarzu! Czy można użyć skryptu, aby zmienić atrybut pliku "tylko do odczytu"?

-- ZO

Cześć ZO. Oczywiście, że można. FileSystemObject może wszystko!

No dobrze, jest kilka rzeczy, których nie potrafi. Ale może zmienić plik tylko do odczytu w plik do zapisu i to przy pomocy zaledwie kilku linii kodu.

Oto skrypt, który łączy się z plikiem C:\Scripts\Computers.txt, sprawdza, czy plik jest tylko do odczytu, a jeśli jest, zmienia go na plik do zapisu:

Const READ_ONLY = 1



Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.GetFile("C:\Scripts\Computers.txt")



If objFile.Attributes AND READ_ONLY Then

    objFile.Attributes = objFile.Attributes XOR READ_ONLY

End If

Proste, no nie? Jedyny haczyk tkwi w tej linii kodu, gdzie sprawdzamy, czy plik jest tylko do odczytu:

If objFile.Attributes AND READ_ONLY Then

To, czy plik jest tylko do odczytu, czy nie, sprawdzamy poprzez ustawienie odpowiedniego przełącznika w masce bitów Attributes (atrybuty). Jeśli przełącznik ten (ma wartość 1; dlatego też utworzyliśmy stałą READ_ONLY i przypisaliśmy jej wartość 1) jest włączony, wówczas plik jest tylko do odczytu. Wyłączony przełącznik oznacza, że plik jest do zapisu.

Ta linia kodu jest dość niejasna (witajcie w świecie logiki boolowskiej), ale można go odczytać w następujący sposób: jeśli przełącznik tylko do odczytu w masce bitowej Attributes jest włączony, uruchom następną linię kodu. Składnia trochę szwankuje, ale trzeba się przyzwyczaić.

Zanim zapytasz: Co by było gdybyś chciał zmienić plik do zapisu w plik tylko do odczytu? Cóż, w tym wypadku sprawdzalibyśmy, czy przełącznik tylko do odczytu nie jest włączony. Użylibyśmy takiej linii kodu:

If Not objFile.Attributes AND READ_ONLY Then

Jak się okazuje, mamy plik tylko do odczytu, skrypt używa boolowskiego operatora XOR, aby "przestawić" przełącznik. Ta linia kodu działa tylko wtedy, gdy przełącznik jest włączony; zostanie on wówczas wyłączony, zmieniający tym samym plik na plik do zapisu. Operator XOR po prostu przestawia z pozycji włączonej na wyłączoną i na odwrót. Dlatego właśnie przed wywołaniem XOR sprawdzamy, czy przełącznik tylko do odczytu jest włączony. Wyobraźmy sobie, że tego nie sprawdziliśmy, a plik był do zapisu. W taki wypadku XOR przestawiłby przełącznik i zmienił nasz plik do zapisu w plik tylko do odczytu.

Zgadza się, to mętne. Podstawy właściwości masek bitowych i logiki boolowskiej znajdziecie w tym rozdziale Przewodnika Skryptowania Microsoft Windows 2000 (j.ang.).

Oczywiście, zamiast po prostu zmieniać jeden plik tylko do odczytu w plik do zapisu, lepiej wziąć od razu cały folder i zmienić wszystkie pliki tylko do odczytu w pliki do zapisu. Czy można to zrobić przy pomocy skryptu? Jasne, że można. Oto skrypt, który używa WMI, aby pobrać listę wszystkich plików tylko do odczytu znajdujących się w folderze C:\Scripts (sprawdza, w których plikach właściwość Writeable jest ustawiona na FALSE). Dalej skrypt przekazuje nazwę pliku do FileSystemObject, a następnie zmienia go w plik do zapisu. Nie będziemy dziś wyjaśniać, w jaki sposób działa kod WMI; zainteresowanych odsyłamy do tej publikacji w rubryce Cześć Skrypciarzu!:

No dobrze, oto ten skrypt:

Const READ_ONLY = 1



strComputer = "."

Set objFSO = CreateObject("Scripting.FileSystemObject")



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



Set colFiles = objWMIService. _

    ExecQuery("Select * from CIM_DataFile where Path = '\\Scripts\\' " & _

        "AND Drive = 'C:' AND Writeable = FALSE")



For Each objFile in colFiles

    Set objReadOnlyFile = objFSO.GetFile(objFile.Name)

    objReadOnlyFile.Attributes = objReadOnlyFile.Attributes XOR READ_ONLY

Next

 

 Do początku strony Do początku strony


Centrum Skryptów - Systemy operacyjne