固定 Dataram RAMDisk 的磁碟代號 – 附示範程式

[Note: We have an English version for this post. Please read here]

背景

自從我編寫了一篇如何避免使用映像檔也可以固定 Dataram RAMDisk 磁碟代號的文章之後,就收到許多讀者的查詢。當中許多涉及執行上的細節,但由於該篇文章並沒有提供一個可直接執行的示例程式,故此在回應讀者的查詢時難免出現描述上的困難。現在,我再撰寫此文及提供一個可以直接執行的示例程式,希望能方便讀者使用和研究。

這篇文章並不是要取代之前所撰寫的文章,而是作為實作的補充。如你對示例程式的原理和解說有興趣,我強烈建議您去閱讀之前撰寫的文章

在本文中,我提供了兩個示例程式:

  1. StartUp.bat:在電腦啟動時,將 RAMDisk 的磁碟代號進行修正,並將一些常用程式自動載入 RAMDisk 中,以及將這些瀏覽器的 Cache 和下載文件設定在 RAMDisk 中,從而達致最佳的瀏覽器速度。
  2. ShutDown.bat:在電腦關機時,將 RAMDisk 的瀏覽器設定檔案及已下載的文件複製到硬碟機中,以免關機後失去這些設定和文件。

這兩個程式是按照我自己的電腦設定來運作的,故此如果你要在你的電腦中使用這些程式,你必須根據以下條件來設定你的電腦。當然你也可以直接修改程式碼去符合你的電腦設定,但前提是你必須了解這些程式碼的運作原理。(詳見此文

電腦設定

請確保你的電腦符合以下設定/假設:

  1. RAMDisk 的磁碟標籤(Disk label)必須是 “RAMDISK” (全部大寫)。設定步驟見原文第 2 步。
  2. RAMDisk 的磁碟代號將會固定為 R: .
  3. 電腦開機後,我們希望電腦能夠自動將  C:\MyRAMDiskFiles 資料夾中的檔案複製到 RAMDisk之中。這個資料夾主要是放置一些常用程式,使他們能夠直接在 RAMDisk 上執行,加快速度。舉個例子,我希望將 Firefox 放在 RAMDisk 上執行,那麼我就先將 Firefox 的程式檔案放在 C:\MyRAMDiskFiles\Programs\Firefox\,那麼當 StartUp.bat 執行後,便可以直接點擊 R:\Programs\Firefox\Firefox.exe 去執行 Firefox 了。
  4. 我的 Google Chrome 安裝在 C:\Program Files,我希望 Chrome 將瀏覽互聯網時產生的暫存檔 (Cache)儲存在 RAMDisk 中,但是由於 Chrome 的暫存檔是放在 Chrome 的安裝目錄下,所以 StartUp.bat 會將該暫存檔目錄轉化為一個虛擬連接,直接連接到 R:\TEMP\BrowserCache 目錄中。如此一來,所有儲存到暫存檔目錄的檔案都會被實際儲存在 RAMDisk 之中,減少硬碟讀寫,並且會在關機時自動清除這些暫存檔。
  5. 在使用電腦的過程中, RAMDisk 上的程式設定可能會被修改(例如 Firefox 插件更新),我希望這些設定在關機後仍能夠保留。所以,在電腦關機前,ShutDown.bat 會將這些程式檔案複寫到硬碟 C:\MyRAMDiskFiles 
  6. 此外,所有從互聯網上下載的檔案,都會被儲存到 RAMDisk 之中 (R:\Download), 並且在電腦關機時,將這些檔案複製到硬碟  C:\Download 資料夾中。

開始

第 1 步

用記事本建立兩個程式檔案: StartUp.bat 和 ShutDown.bat, 並儲存在 C:\ (或其他你喜歡的資料夾中,在之後的步驟中你需要指定這些程式檔案的位置。)

注意!!我們的程式碼是以 DOS Batch Script 形式編寫, “斷行”(line-break) 在此 DOS Batch Script 中有特定意義,故千萬不要隨便在程式碼中增加“斷行”。如果你使用“複製-貼上”的方式從本文建立程式碼,我們建議你小心檢查一下有沒有額外的“斷行”被加插入去。為避免麻煩,我們建議你直接下載這些程式碼:  RAMDisk fix drive letter - sample scripts

此外,你必須將程式碼中的 [Your-Windows-user-name] 修改為你的 Windows 用戶名稱。

程式 1: C:\StartUp.bat

@echo off

@rem assign the key variables, see assumption #1 & #2
SET _label=RAMDISK
SET _ramdrive=R:

@rem Find the drive letter which has volume name set as RAMDISK, and mount it to _ramdrive
FOR /F "skip=1 tokens=1 delims=: " %%a IN ('wmic logicaldisk where "VOLUMENAME='%_label%'" GET CAPTION') DO (
	subst %_ramdrive% %%a:\
)

@rem initialize the ramdisk - automatically copy the files in C:\MyRamDriveFiles to the ramdisk after the Windows starts. see assumption #3
mkdir %_ramdrive%\Programs
xcopy C:\MyRamDriveFiles\*.* %_ramdrive%\Programs\ /E/Q/Y/R

@rem link the google chrome cache folder to ramdisk. Remeber to replace [Your-Windows-user-name] with your own, see assumption #4
mkdir %_ramdrive%\TEMP\BrowserCache
mklink /j "C:\Users\[Your-Windows-user-name]\AppData\Local\Google\Chrome\User Data\Default\Cache" "%_ramdrive%\TEMP\BrowserCache"

@rem create a dir in ramdisk to stores the downloaded files, you will need to set up Firefox to store downloaded files in R:\Download, see assumption #6
mkdir %_ramdrive%\Download

@echo on

程式 2: C:\ShutDown.bat

@echo off

@rem see assumption #2
SET _ramdrive=R:

@rem copy all program files back to harddisk -  see assumption #5
xcopy %_ramdrive%\Programs\*.* C:\MyRamDriveFiles\ /Q/Y/R/S/D/C

@rem copy all downloaded files back to harddisk  -  see assumption #6
mkdir C:\Download
xcopy %RAMDISK%\Download\*.* C:\Download\ /S/D/Q/R/C

rem disconnect the google chrome cache folder linking -  see assumption #4
rmdir "C:\Users[Your-Windows-user-name]\AppData\Local\Google\Chrome\User Data\Default\Cache"

rem delete the drive mounting
subst %RAMDISK% /D

echo on

第 2 步

參照此文並執行該文的步驟3.

第 3 步

現在我們已經利用本機群組原則編輯器(Group Policy Editor)在 StartUp.bat 加入了“啟動” (Startup)項目中,請重複該文的步驟 3.2, 將 ShutDown.bat 加入到 “關機” (Shutdown) 項目中。

至此,我們應該在 “啟動”(Startup)中已經有 “C:\StartUp.bat”, 而在 “關機”(Shutdown)中則有”C:\ShutDown.bat” 項目.

Startup script

第 4 部

請確保你的電腦符合上述的“電腦設定”的要求,特別檢查一下你的電腦中已經建立了 “C:\MyRAMDiskFiles” 和 “C:\Download” 資料夾。一切妥當後,請重啟電腦即可。

如何固定 Dataram RAMDisk (虛擬磁碟) 的磁碟代號

[Note: We have an English version for this post. Please read here]

RAMDisk

Dataram RAMDisk 是一個非常流行的免費 RAMDisk (虛擬磁碟,即將一部分記憶體分隔出來當成普通磁碟機使用。) 軟件。它與特色包括免費,最高可以設定 4GB 容量的虛擬磁碟(足夠應付大部分用途,收費版本可設定 4GB 以上的容量),免費版還同時支持 32 Bit 和 64Bit (某些競爭對手只有 32Bit 是免費,64Bit要收費),而且在各項測試中性能表現甚佳。如果您使用的是 32 Bit的 Windows 系統的話,Dataram RAMDisk 還可以突破系統4GB 記憶體的限制,讓您將 4GB 以外的記憶體設定為虛擬磁碟,不致浪費了寶貴的記憶體資源。我自己則從升級到 Win7 系統開始就使用 Dataram RAMDisk 至今已經有好長時間,對於它的性能和穩定性完全沒有任何問題。

唯獨…

我對這個軟件的唯一投訴就是,軟件本身無法將虛擬磁碟的磁碟代號進行固定,而是每次啟動時按最後的磁碟代號自動設置,這就為用家帶來很大的不便了。舉個例子,今天我開啟電腦後,我的虛擬磁碟是 K:,我將我的 Firefox 緩存檔設定在 K:\Cache 目錄下。第二天,我在啟動電腦前插上了一個 USB 磁碟,電腦開啟後,會自動將這個USB磁碟設定為 K: ,然後虛擬磁碟就順序使用了 L: 作為磁碟代號。這下可好了,當我打開 Firefox 的時候,它會將所有緩存資料儲存在 K:\Cache,也就是儲存在我的 USB 磁碟中,而不是虛擬磁碟中。當然,沒有一個用戶希望發生這樣的事情。用戶需要一個固定不變的磁碟代號。

官方解決方案

Dataram 也意識到這個問題,於是在軟件的用戶手冊中提出了一個解決方案,我稱之為官方解決方案。方案如下:先啟動軟件,設定好虛擬磁碟,並在控制台中將虛擬磁碟的代號設定為想要的代號,然後將虛擬磁碟的內容儲存成硬碟中的一個映像檔,然後每次啟動軟件的時候,自動載入這個映像檔,(有點像電腦遊戲中的“儲存”和“載入”的功能),那麼就可以每次都恢復相同的設定,包括磁碟代號。

但是,這個官方解決方案有兩個弊端,使得我個人認為比不用還好。

  1. 這個方案需要在磁碟機中建立一個與虛擬磁碟大小相同的映像檔。(雖然最新版本可以對映像檔進行壓縮,但是每次執行都要進行解壓縮,是用時間來空間,與使用 RAMDisk 的意願不符)
  2. 每次啟動軟件時,都需要載入這麼大的映像檔,既費時,又增加硬碟讀寫消耗,與RAMDisk 使用的意願不符。

我的方案:使用 DOS Batch 程序

為此,我專門寫了一個小小的 DOS Batch 程序,(如不計算程序中的註解的話,真正的程式碼只有三行)。這個程式使用了 Dataram RAMDisk 的一個特性功能:允許用戶指定磁碟機名稱(Drive Label),磁碟機名稱與磁碟機代號不同。對於系統而言,是使用磁碟機代號(C:, D:, E: …)來代表不同的磁碟機,但對於用戶而言,我們可以使用磁碟機名稱(“SystemDisk”, “MediaDisk” …)來表示不同的磁碟機。在Dataram RAMDisk,用戶可以為虛擬磁碟指定一個每次啟動都保持不變的磁碟機名稱。我的方案原理就是:每次啟動時,以指定的磁碟機名稱找出磁碟機代號(動態分配的代號,如 K:),然後建立另一個指定代號(如R:)的磁碟,將這個動態分配的代號(K:)與指定的代號(R:)進行關聯。那麼,無論我們打 “K:\Cache” 還是 “R:\Cache”,系統都會連到相同的目錄。

詳細步驟

為了將事情簡單化,我在這裡列出每一步步驟。

1. 建立一個 DOS Batch 檔案

用“記事本”建立一個文字檔案,敲入以下的程式碼,然後儲存為 C:\StartUp.bat(當然您可以使用其他名稱或儲存在其他地方)。由於“斷行”在 DOS Batch 檔案中是代表程式碼完結,故此,千萬不要隨意在這些程式碼中間加入“斷行”,否則可能會造成程式不能執行。

@rem assign the key variables.
SET _label=RAMDISK
SET _ramdrive=R:

@rem Below is the magic happens : Find the drive letter which has volume name set as _label, and mount it to _ramdrive
FOR /F "skip=1 tokens=1 delims=: " %%a IN ('wmic logicaldisk where "VOLUMENAME='%_label%'" get caption') DO ( subst %_ramdrive% %%a:\ )

@rem if you want to copy some files or mount your cache folders, do it after this line.

以下是關於這段程式碼的詳細說明,如果您對 DOS Batch 程式碼沒有興趣,絕對可以跳過這段,直接進行步驟2。

這一行:

wmic logicaldisk where "VOLUMENAME='RAMDISK'" get caption

是要根據磁碟機名稱 (VOLUMENAME) 找出磁碟機代號 (caption),執行結果如下:

Caption
K:

這個結果是以字串形式給出的,然後我們透過一個 for-loop ,逐行分拆這個結果,第一行 (caption) 可以跳過,第二行就是我們想要的東西。我們要將第二行用冒號 “:” 拆開,得出 “K” 和 “”(空字元) 兩個元素,按後將第一個元素 “K” 儲存到變量 %%a 之中。那麼我們就可以用 %%a 變量去代表這個動態分配的磁碟機代號了。

關於這個 for-loop 的解釋:

“skip=1” : 跳過第一行 (”Caption”)。第一行文字並沒有我們需要的東西。

“tokens=1” : 對於每一行文字,我們只取出以 “:” 分拆後的第一個元素。

“delims=:” : 使用冒號 “:” 來分拆每一行文字。

於是,最後我們取得動態分佈的磁碟機代號,並儲存在 %%a 變量中,然後在之後的 subst 程式碼中,我們實際上是執行這樣的指令:

subst R: K:\

這指令是讓系統知道,R: 就是 K: 的另一個名稱,以後無論是用 “R:” 還是 “K:”,兩者這實際都對應到 K: 的地方。

2. 指定虛擬磁碟機的名稱

打開 Dataram RAMDisk Configuration Utility (設定工具), 在 “Disk Label” 中打勾,並在下面輸入 “RAMDISK”

當然您也可以用其他名稱,但必須在上面的 DOS Batch 程式碼中作出修改:

SET _label=TheNewDriveLabel

3. 指定開機時執行上述程式碼

我們需要告訴電腦,在開機時自動執行步驟一的程式碼。

3.1 按 Win + R 組合鍵 (或在 “開始” 選單中按 “執行…”), 這時會出現一個 “執行…” 的對話框,輸入 “gpedit.msc” 並在結果中選擇 “gpedit” 。

注意:在某些Win7版本中(如 Win7 Home Edition),gpedit.msc 並沒有被納入系統中,在此情況下,我們需要使用 Windows 自帶的工作排程器(Task Scheduler)去讓Windows在啟動時自動執行上述的程式碼。關於工作排程器的詳細操作請見 http://windows.microsoft.com/zh-TW/windows7/schedule-a-task

3.2 在 “Group Policy Editor”(本機群組原則編輯器)中, 按 “Local Computer Policy”(本機電腦原則) -> “Windows Settings”(Windows 設定) -> “Scripts(Startup/Shutdown)” (指令碼(啟動/關機)),在編輯器右面,按兩下 “Startup” (啟動)

Startup script

3.3 在 “Scripts” (指令碼) 頁簽中,點擊 “Add…” (新增),然後將 “C:\StartUp.bat” (也就是步驟一建立的那個程式檔)加入到清單中,按 “OK” (確定) 完成。

4. 大功告成

現在,您可以重新開啟您的電腦,然後會發現“我的電腦”除了原來的虛擬磁碟機 (假設為K:)之外,還會多了一個 “R:”,打開 R: 磁碟機,內裡的內容與 K: 完全一樣。事實上,兩個代號其實都是指向相同的檔案,故此你在其中一個磁碟機中做的任何動作,在另一個磁碟機也會一樣改變。更重要的是,現在無論您的虛擬磁碟機是什麼代號,您的電腦中永遠都可以用 R: 來代表這個虛擬磁碟機了。

總結

這個方法雖然看上去好像很多步驟很繁複,但是實際上是比官方解決方案更加簡便。因為這個方法:

第一,只是三行程式碼,執行所需時間 0.000001 秒也不到,不會拖慢開啟速度,

第二,不會產生龐大的磁碟映像檔,因此可以減少對硬碟機的讀寫損耗,也不會被映像檔平白佔用了硬碟空間。

第三,也是最重要的,是以後開機不需載入龐大的映像檔,大大加快開啟的速度。

最後,這個方法也不是沒有缺點。由於程式是透過 subst 指令去將兩個磁碟機代號鏈接起來,故此,即使我們只需要 R: 來存取虛擬磁碟,但是虛擬磁碟的原來磁碟代號(K:)也會一併保留起來,故最後在我的電腦中您會看到有 R: 和 K: 同時並存。暫時我還是無法找出方法可以將 K: 隱藏起來。在本文章的英文版中,Merjin 讀者留言提出一個用  “diskpart” 取代 “subst” 指令的方法,那是直接將 K: 更改為 R:(而不是建立磁碟鏈接)。那是一個更好的方法,能夠解決上述兩個磁碟機並存的問題。我個人並沒有嘗試,有興趣的讀者可以去那篇文章中的讀者留言看看有關詳情。

歡迎各位讀者留言討論。