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
很簡單吧?唯一比較巧妙的部分是在這一行程式碼中,這是我們在檢查檔案是否唯讀時用的:
If objFile.Attributes AND READ_ONLY Then
我們用來判定檔案是否是唯讀的方法,是檢查「屬性」位元遮罩中的適當參數。如果這個參數 (此參數值為 1,這是我們建立名為 READ_ONLY 的常數並指定其為值 1 的原因) 是啟用的,則該檔案便是唯讀的。如果該參數不是啟用的,則該檔案是可寫入的。
這一行程式碼有點令人混淆 (歡迎來到布林邏輯的世界!),不過可以讀成這樣子:如果「屬性」位元遮罩中的唯讀參數是啟用的,則執行下一行程式碼。這個語法看起來有點笨拙,不過這是我們得忍受的。
在您詢問之前先告訴你,該怎麼把可寫入檔變更為唯讀檔呢?在那個情況下,我們會判定唯讀參數是否「未」設定。因此,我們會用以下這行程式碼代替:
If Not objFile.Attributes AND READ_ONLY Then
如果結果是唯讀檔,則指令碼會使用布林運算子 XOR 來「翻轉」唯讀參數。這一行程式碼只有在唯讀參數啟用時才會執行;因此,它會將這個參數關閉,而使得檔案變成可寫入的。運算子 XOR 只是把開啟轉換成關閉,再把關閉轉換成開啟而已。這是為什麼我們在呼叫 XOR 之前先檢查看看唯讀參數是否啟用的原因。假設我們沒有檢查,並假設檔案是可寫入的。若是這樣,XOR 會翻轉參數,並使得可寫入檔變成唯讀檔。
是的,有點令人困惑。要取得位元遮罩屬性與布林邏輯的初步入門,您可以看一下 Microsoft Windows 2000 指令碼指南的這個部分。
當然,除了簡單地將唯讀檔改成可寫入檔之外,更常見的工作是進入資料夾並將「所有」唯讀檔改成可寫入的。這指令碼做得到嗎?當然可以。此處有一個指令碼,使用 WMI 來擷取資料夾 C:\Scripts 中所發現的所有唯讀檔清單 (透過檢查 Writeable 屬性為 FALSE 的檔案的方式)。然後指令碼會針對每一個檔案,傳回檔名給 FileSystemObject,並執行將檔案變成可寫入的工作。我們今天不會解釋所有的 WMI 程式碼如何運作;如果您對此有興趣,可以參考嗨,Scripting Guy!專欄。
對了,指令碼在這裡:
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
|