嗨,Scripting Guy!

Hey,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

今天的問題:如何將唯讀檔變更為可寫入的?


如何將唯讀檔變更為可寫入檔?

嗨,Scripting Guy!有可能使用指令碼來變更檔案的唯讀屬性嗎?

-- ZO

ZO,您好。當然,您做得到;FileSystemObject 可以做到任何事!

嗯,好吧,也不是能做到任何事。而且,沒錯,它就是做不到那件事。但它「可以」將唯讀檔變更為可寫入檔,而且只需幾行程式碼就做得到。

這裡有一個繫結至檔案 C:\Scripts\Computers.txt 的指令碼,請查看該檔案是否是唯讀的,如果是,將它變更為可寫入:

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

如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首