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