如何固定 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:(而不是建立磁碟鏈接)。那是一個更好的方法,能夠解決上述兩個磁碟機並存的問題。我個人並沒有嘗試,有興趣的讀者可以去那篇文章中的讀者留言看看有關詳情。

歡迎各位讀者留言討論。

8 Replies to “如何固定 Dataram RAMDisk (虛擬磁碟) 的磁碟代號”

  1. 我利用你提供的方法 以及 Merjin 的提示 修改了您的 code 如下 :
    SET _label=RAMDISK
    FOR /F “skip=1 tokens=1 delims=: ” %%a IN (‘wmic logicaldisk where “VOLUMENAME=’%_label%’” get caption’) DO ( echo SELECT VOLUME %%a>>C:\tmpSript.txt
    echo ASSIGN LETTER R>>C:\tmpSript.txt
    echo EXIT>>C:\tmpSript.txt
    DiskPart.exe /s C:\tempSript.txt
    DEL C:\tmpSript.txt
    EXIT)
    這是我第一次寫bat 因為不知道覆寫tmpScript怎麼寫所以直接刪除,想請問 : 覆寫與每次開機新建刪除tmpScript哪種作法對SSD哪個比較好呢?

    1. 很抱歉,對於SSD 在 “新建” 和 “覆寫” 操作上的性能差異, 我沒有深入研究過。希望其他讀者能提供答案。

    2. 花了不少時間找資料並修改程式,才發現做了前人已經做過的事…囧rz
      我貼出我的程式碼如下四段,放在原檔FOR-DO裡面就能運作
      echo select volume %%a > %%a:\diskpart.script
      echo assign letter %_ramdrive% >> %%a\:diskpart.script
      diskpart %%a:\diskpart.script > nul
      del %_ramdrive%\diskpart.script
      方法跟上面大同小異,因為我也是使用SSD當系統碟,所以我索性把產生的檔案直接建立在RamDisk就好了
      p.s.在bat中,只要一個>就會是覆寫輸出,兩個>>會是追加(找資料順便看到的)

    1. 作者有另一篇教學文,幾乎複製貼上再設定一下開機啟動就好了
      http://www.zomeoff.com/固定-dataram-ramdisk-的磁碟代號-附示範程式/
      不過有兩個小地方要注意
      1.兩個檔案需要修改的是把[Your-Windows-user-name]改成你的使用者名稱,或是可以改成%username%讓他自己去抓使用者變數
      2.建議在StartUp.bat的第18行上方加上一段
      rmdir /s /q “C:\Users\%username%\AppData\Local\Google\Chrome\User Data\Default\Cache” > nul
      主要用意是刪除資料夾,因為mklink指令當資料夾已存在時,會無法做連結。
      但事實上刪除的動作只要手動做過一次就可以了,因為往後就不會產生實體的資料夾了,只是我覺得加入後至少一勞永逸,因為不是每次都會去注意到這個小細節,也不是每個人都會去了解程式碼的原理,而且不會多耗多少資源。

  2. 用 win7 x64 home premium 的工作排程器不能簡單運行,似乎要把使用者改成SYSTEM才成功…..詳細步驟紀錄如下,供先進參考研究:
    (測試配備:win7 x64 home premium 隨機版 + 筆電 ASUS N53SM)

    1.在桌面”我的電腦”按右鍵->點選”管理”
    2.依序展開: 電腦管理(本機)->系統工具->工作排程器->工作排程器程式庫
    3.按右邊”建立工作”鈕,跳出內容視窗,由左到右依序設定:
    (1)”一般”標籤:
    a.工作名稱:輸入ramdisk(名稱任取)
    b.點選右邊”變更使用者及群組”按鈕,輸入”SYSTEM” <-關鍵步驟!!
    c.下方"以最高權限執行"打勾
    d.設定"windows 7, windows server 2008 R2"(不曉得有啥用,反正我設了)
    (2)"觸發程序"標籤: 按"新增",選"啟動時"
    (3)"動作"標籤: 按"新增",選"啟動程式",輸入 "C:\RAMDISK.BAT"
    (4)"條件"標籤: 全部取消勾選
    (5)"設定"標籤: 只要勾第一個"允許依需求執行工作",其餘取消

    4.編輯您的 RAMDISK.BAT:假如裡面有使用 %username%,必須ˋ手動取代成您的windows使用者名稱(推測是因為在登入前用 SYSTEM 執行的關係,所以抓不到使用者名稱)

    最後聲明….因為小弟完全不懂背後原理,只會土法煉鋼,所以參考本文須自負風險,小弟亦無法回答任何問題。

Leave a Reply

Your email address will not be published. Required fields are marked *