Share via


嗨,Scripting Guy!

Hey,Scripting Guy!

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

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


我要如何將唯讀檔案變更為可讀寫檔案?

嗨,Scripting Guy!我要如何將唯讀檔案變更為可讀寫檔案?

-- WR

WR,您好。我們不想驚嚇你,不過您如何能將唯讀檔案變更為可讀寫檔案呢?怎麼了?當然是使用指令碼來解決嘛!

我們明白:您沒有預料到這種開頭,不是嗎?

事實上,使用以下這段指令碼,您就能將 C:\Scripts\Test.vbs 檔案從唯讀檔案變更為可讀寫檔案:

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

您的想法很正確:我們確實「應該」解釋其中的奧妙。我們一開始將常數 ReadOnly 的值設定為 1 (稍後將會對此說明)。然後我們建立 FileSystemObject 的例項,並使用 GetFile 方法連結到 C:\Scripts\Test.vbs。直到目前為止,一切都很順利。

然後程式碼開始變得奇怪,或者至少是有點不太尋常。「唯讀」屬性會其他檔案屬性,例如:Hidden (數值 2 表示該檔案是一個隱藏檔案) 和 System (數值 4 表示該檔案是一個系統檔),一起儲存為「位元遮罩」的一個部分。在位元遮罩 (可以鬆散地定義為儲存成單一數值的屬性集合) 中的個別屬性,就像是切換參數一樣,其狀態可以是開啟或是關閉的。如果開啟具有 1 數值的切換參數,檔案就是唯讀的;如果關閉具有 1 數值的切換參數,檔案就是可讀寫的。

於是就只剩下一個問題:您要如何判斷這些切換參數是開啟或是關閉的?完整的解釋將會超出本專欄的範圍,不過簡單的答案是,您可以使用「位元 AND」(bitwise AND) 運算子。請注意指令碼中,看起來樣子很奇怪的這行:

If objFile.Attributes AND ReadOnly Then

信不信由您,這行是要檢查 ReadOnly 屬性 (數值為 1) 是否已開啟。如果我們要查看檔案是否為隱藏檔案,應該怎麼辦?好的,在這種情況下 (並假設我們將名為 Hidden 的常數設定為 2),我們會使用以下這行程式碼:

If objFile.Attributes AND Hidden Then

基本上,我們可以將這裡的 AND 運算子解釋為:「如果我們查看檔案的屬性並看到 ReadOnly 切換參數是開啟的,那麼這就是個唯讀檔案,而且此 If 陳述式為 True。如果 ReadOnly 切換參數是關閉的,那麼此 If 陳述式為 False。」有經驗的指令碼撰寫者可能對這種解釋不太滿意,不過這樣應該能夠讓您瞭解其中的作用。

那麼我們為何要查看檔案是否是唯讀的?我們將要暫時使用 XOR 運算子來「翻轉」切換參數,這也就是以下這行程式碼的作用:

objFile.Attributes = objFile.Attributes XOR ReadOnly

在此範例中,XOR 直接將檔案從一種狀態切換到另一種狀態。如果檔案是唯讀的,XOR 就會將它切換成可讀寫;如果檔案是可讀寫的,XOR 則會將它切換成唯讀。這也是我們為何首先要查看檔案是否「已經」唯讀的原因。如果檔案是唯讀的話,我們就要翻轉切換參數並使檔案變成可讀寫。如果檔案已經是可讀寫的,我們當然就不必翻轉切換參數;因為這樣就會使檔案變成唯讀 (請記得,我們只是從一種狀態切換成另一種狀態)。

您的想法很正確:這種位元運算的玩意兒實在令人困惑,我們必須給您一些補償。因此,以下這段指令碼會連結到資料夾 C:\Scripts,並將資料夾中的所有唯讀檔案都變成可讀寫檔案。我們不想在此解釋指令碼如何取得資料夾中所有檔案清單的幕後細節;這些留待明天的專欄再說明。(這樣就能讓您明天再回來這裡!)不過,現在該奉上禮物了:

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

好了,明天再見!


如需詳細資訊

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

 

回到頁首 回到頁首