利用 SUBST,解决格盘烦恼

引言

本文所述操作方法重启后会失效,请通过 Batch 脚本或其他自动化方式执行。
本文所述操作方法不能替代硬件分区。

刚买来的电脑,或者是刚换的硬盘。
商家有些时候会问:“分几个区?”
而可爱的顾(meng)客(xin)有时也总是抢在商家前面:“分四/五个区!”

硬盘分区介绍

在日常的使用中,我们遇到的 PC 机,几乎没有分区数 <3 的。(这不是颜文字(雾
我们打个比方,硬盘相当于一个空荡荡的箱子,实际容积有那么大,但是它本身就有一片“加固区域”(分区数据 / 文件表),你放不了东西在里面。
而你需要把各个区域隔开,这样你才能让多个空间互不影响。
你有一本《康熙字典》,
总空间能放进去;
但是隔板太多,每个小空间都放不下···
并且隔板本身也会占用一部分空间。
比如,用到后期,你会发现那种神作:

今天我想看看电影。
下载一部看吧,8 GiB。
什么?磁盘空间不足?换盘换盘!
C:
■■■■■■■■■□ 90% 1GB 可用
D:
■■■■■■■■□□ 80% 5GB 可用
E:
■■■■■□□□□□ 50% 5GB 可用

Excuse me?

但是我们多区合为一区,就不存在那种问题。

具体详见 Wikipedia.

什么是 SUBST

SUBST 是 Microsoft Windows 自带的文件夹映射工具,它能将一个文件夹映射为一个虚拟驱动器,与文件夹所属驱动器共享空间,虚拟驱动器的读写权限取决于原文件夹的权限设定。
再次警告:文件夹映射在重新启动后会失效,
但我并不是很懂为什么 Micro$hit 不在 EXPLORER 里面添加这个选项。
以下为 SUBST /? 的输出 (Microsoft Windows [Version 6.1.7601]):

将路径与驱动器号关联。

SUBST [drive1: [drive2:]path]
SUBST drive1: /D

drive1: 指定要分配路径的虚拟驱动器。
[drive2:]path 指定物理驱动器和要分配给虚拟驱动器的路径。
/D 删除被替换的(虚拟)驱动器。

不带参数键入 SUBST,以显示当前虚拟驱动器的列表。

实战

新买到的电脑 / HDD / SSD, 我们可以分两个区就 OK:

C: - 系统分区 (30%)
D: - 软件 / 映射用分区 (70%)

系统分区我们一般可以不用动它(墙裂反对文稿数据放在系统分区的行为)。
软件分区,我们准备这样几个文件夹:

Archives
Documents
Downloads
Images
Program Files
Program Files(x86)
Temporary
Videos
Workspaces

那么我们可以针对每一个文件夹执行一次映射。

SUBST E: D:\Archives
SUBST F: D:\Documents
SUBST G: D:\Downloads
SUBST H: D:\Images
SUBST I: D:\Temporary
SUBST J: D:\Videos
SUBST K: D:\Workspaces

完成以后,你就会发现多出了 7+ 个 “本地磁盘”。
如何重命名呢?谁也不想重新启动以后手动重命名吧。
幸运的是,M$ 提供了 LABEL 指令。
LABEL 输出:

创建、更改或删除磁盘的卷标。

LABEL [drive:][label]
LABEL [/MP] [volume] [label]

drive: 指定驱动器号。
label 指定卷标。
/MP 指定卷应被视为装入点或卷名。
volume 指定驱动器号(后面跟一个冒号)、装入点或卷名。如果指定了卷名,/MP 标志则不必要。

也就是说,我们可以组合 SUBST 和 LABEL 指令共同完成自动化的虚拟驱动器映射。
注意: SUBST 不需要管理员特权, LABEL 需要 Administrators 及其以上的权限。
我们可以写一个 Batch Script, 保存为 .cmd / .bat 文件运行。
代码:

@echo off
rem Code from Elepover's Blog (https://kruin.net)
rem Copyright (C) 2017 Elepover.
echo Creating link...
subst E: D:\Archives
subst F: D:\Documents
subst G: D:\Downloads
subst H: D:\Images
subst I: D:\Temporary
subst J: D:\Videos
subst K: D:\Workspaces
...
echo Linking complete. Renaming...
label E: Archives
label F: Documents
label G: Downloads
label H: Images
label I: Temporary
label J: Videos
label K: Workspaces
...
echo Renaming complete.
echo Finished.
exit

甚至我们可以精简成一行指令:
cmd /c subst E: D:\Archives | subst F: D:\Documents | subst G: D:\Downloads | subst H: D:\Images | subst I: D:\Temporary | subst J: D:\Videos | subst K: D:\Workspaces | ... | label E: Archives | label F: Documents | label G: Downloads | label H: Images | label I: Temporary | label J: Videos | label K: Workspaces
(实际上是利用了命令提示符中的 “|” 符号。)

如果使用 VBScript 的话,咱可以实现无窗口执行。
注意必须要给脚本管理员权限或者 Invoker 的权限等级为 Administrators+ 才能实现完美工作。
完毕以后,将脚本文件放在

%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup

(可直接键入资源管理器地址栏,通用。)
或者是修改注册表达到开机启动的目的。

大概能想到的就这么多了,回见!