2024年1月19日发(作者:)

Win7 巧用

Win7/Vista 巧用 实现系统和用户文件的分区存放

桌面、我的文档、我的图片等等,尤其是软件的配置,一切都没了。很多来不及转移的资料都没了,颇为心痛!

从 Vista 以后,微软将用户文件和用户的软件配置( AppData ) 明确划分开,并且全部存放在使用者的用户目录下。

Linux早已这样做了,并且在Linux中可将 home 挂载为独立分区,而微软显然还没学到家。用户目录依旧和系统目录一起放在同一分区。

如何将用户目录移动到非系统分区?这是本文的出发点。但本文的重心不在于此,而是

mklink ,一个命令。

一、何为 mklink

mklink 是何方神圣,值得专门作文讲述?

如果用过 Linux ,那想必也看到过符号链接(这是一种特殊的文件),也用过 “ ln ” 这个链接命令,mklink 和 ln 的功能几乎一样。

mklink 便是用来创建符号链接的,这个命令并不知名,使用的人也不多。

自从 Vista 以后,微软便在 widows中 偷偷地用起了这个工具 。在用户目录下,可以看到很多很像快捷方式的文件,当然这是隐藏的,但却不能打开,其实这便是符号链接。

>dir C:Userswclu /a

驱动器 C 中的卷是 win7

卷的序列号是 8CD0-A743

C:Userswclu 的目录

2009/06/11 11:42

.

2009/06/11 11:42

..

2009/06/11 00:04

AppData

2009/06/11 00:04 Application Data [C:UserswcluAppDataRoaming]

2009/06/11 00:04

Contacts

2009/06/11 00:04 Cookies

[C:UserswcluAppDataRoamingMicrosoftWindowsCookies]

2009/06/11 10:05

Desktop

2009/06/11 00:04

Documents

2009/06/11 02:44

Downloads

2009/06/11 00:04

Favorites

2009/06/11 00:04

Links

2009/06/11 00:04 Local Settings [C:UserswcluAppDataLocal]

2009/06/11 00:04

Music

2009/06/11 00:04 My Documents [C:UserswcluDocuments]

上述标红色的文件,便是符号链接了(上述文件并非C:Userswclu目录下全部文件) 。

Vista/Windows 7使用这些符号链接,是为了兼容XP等系统。

二、mklink 用法

mklink 只能在命令提示符 “CMD” 中使用。

>mklink /?

创建符号链接。

MKLINK [[/D] | [/H] | [/J]] Link Target

/D 创建目录符号链接。黙认为文件

符号链接。

/H 创建硬链接,而不是符号链接。

/J 创建目录联接。

Link 指定新的符号链接名称。

Target 指定新链接引用的路径

(相对或绝对)。

注:上述的符号链接等同于Linux中的软链接。

为了试验 mklink 的功能,我在 C分区中创建目录 a ,并在目录中存放文件 。

创建文件链接

E:>mklink c:1 c:拒绝访问。

E:>mklink c: c:

为 c: <<===>> c: 创建的符号链接

可见为文件创建链接时,符号链接文件的扩展名要和原文件保持一致。

E:>mklink c: d:

当文件已存在时,无法创建该文件。

E:>mklink d: c:

为 d: <<===>> c: 创建的符号链接

可见为文件创建链接时,必须是 “mklink 符号链接文件名 原文件名”的格式。

创建目录链接

E:>mklink /d c:b d:a

为 c:b <<===>> d:a 创建的符号链接

虽然d:a 目录不存在,但依然可以创建链接,很好很强大。但打开链接时,提示错误。

E:>mklink /d d:a c:a

为 d:a <<===>> c:a 创建的符号链接

E:>dir d: /a

驱动器 D 中的卷是 soft

卷的序列号是 BE86-8884

D: 的目录

2009/06/11 10:00

$

2009/06/11 13:08 [c:]

2009/06/11 13:18 a [c:a]

2009/06/11 12:54

Program Files

2009/06/11 09:58

System Volume Information

1 个文件 0 字节

4 个目录 31,089,442,816 可用字节

当把D分区中的链接文件删除时,C分区中的文件和文件夹不受任何影响。

三、mklink /d 与 makelink /j 的异同

从 mklink 的帮助中可以看到,两者皆可以创建目录链接。

细心的同学可以发现,前者是创建目录链接,而后者是创建目录联接。

一字之差,有何分别?

下面分别用这两种方式为同一目录创建链接:

E:>mklink /j d:a c:a

为 d:a <<===>> c:a 创建的联接

E:>mklink /d d:b c:a

为 d:b <<===>> c:a 创建的符号链接

下面显示D分区中的文件及目录列表:

E:>dir d: /a

驱动器 D 中的卷是 soft

卷的序列号是 BE86-8884

D: 的目录

2009/06/11 10:00

$

2009/06/11 13:33 [c:]

2009/06/11 13:34 a [c:a]

2009/06/11 13:35 b [c:a]

2009/06/11 12:54

Program Files

2009/06/11 09:58

System Volume Information

1 个文件 0 字节

5 个目录 31,089,442,816 可用字节

mklink 不加参数或加参数 /d 时,创建的链接文件为型(代表链接到目录)。

当加参数 /j 时,只能为目录创建联接,并且创建的联接文件为型,两种类型的链接文件有显著区别:

从最开始的 “ >dir C:Userswclu /a ” 可以看出,微软自家使用的都是型,至于为何,留待考证。

四、链接文件的特性

刚刚讲述了如何用 mklink 创建链接文件,那么接下来重点讲述如何链接文件的特性,既然是特性,那就是与众不同了。

符号链接文件自身不能被 “复制”(只能通过特殊方法才能复制)

当复制符号链接文件时,会将符号链接所链接的目标文件或目录进行复制,并非是复制符号链接文件本身。

如何实现符号链接文件的复制呢?

>copy /?

/L 如果源是符号链接,请将链接复制

到目标而不是源链接指向的实际文件。

>xcopy /? /B 对照链接目标复制符号链接本身

/* d: 为型符号链接 */

E:>xcopy d: e: /b

目标 E: 是文件名

还是目录名

(F = 文件,D = 目录)? F

D:

复制了 1 个文件

/* d:a 为型符号链接 */

E:>xcopy d:a e:a /B

目标 E:a 是文件名

还是目录名

(F = 文件,D = 目录)? D

复制了 0 个文件

/* d:b 为型符号链接 */

E:>xcopy d:b e:b /B

目标 E:b 是文件名

还是目录名

(F = 文件,D = 目录)? D

复制了 0 个文件

E:>dir e: /a

驱动器 E 中的卷是 data

卷的序列号是 FEEE-FB51

E: 的目录

2009/06/11 10:00

$

2009/06/11 13:33 [c:]

2009/06/11 13:34

a

2009/06/11 13:35 b [c:a]

2009/06/11 09:58

System Volume Information

1 个文件 0 字节

4 个目录 31,362,203,648 可用字节

可见采用xcopy命令并上参数 /B ,可以成功复制 型的符号链接文件,而型链接却不能被复制。

符号链接文件的透明性

符号链接的操作是透明的:对符号链接文件进行读写的程序会表现得直接对目标文件进行操作。

普通的文件操作命令(如cp、rm等)都能直接作用于符号链接。用于读写文件内容的命令将会直接访问目标文件。

五、使用 mklink 实现用户目录的移动

前面说过本文的出发点是“移动用户目录到非系统分区”,想起以前中学写作文,很强调 “首尾照应”,那么,照应来了。

如何通过mklink实现vista/windows7中用户目录的移动?可参考以下两篇文章:

/?11

/move-user-profile-in-windows-7/

引用其中部分内容,也即是具体步骤:

在“计算机管理”里把Administrator用户激活,注销后用Administrator登录;

把“C:Users我的用户名”整个目录移到其它盘上,假设移到“D:我的用户名”;

用mklink创建目录链接:mklink /d C:Users我的用户名 D:Users我的用户名;

重新登录你自己的帐号,大功告成;

下次重装时,还用同一个用户名,先用Administrator登录后把新系统中的"C:Users我的用户名"

删除(否则mklink会报无法创建链接),再用第3步把你位于D盘上的目录重新做下链接即

可。

(本人注:推荐进入双系统或者 Winpe, 移动 C:Users 中的用户目录。)

直接按照以上步骤进行操作会出现上述我所说的问题,原有 C:Users我的用户名 目录下的符号链接文件在复制后会失效,变成一个个空目录。

为了解决这个问题,可在 D:Users我的用户名 新建系统原有链接文件。

mklink /D "D:UserswcluApplication Data" D:UserswcluAppDataRoaming

mklink /D "D:UserswcluCookies"

D:UserswcluAppDataRoamingMicrosoftWindowsCookies

mklink /D "D:UserswcluLocal Settings" D:UserswcluAppDataLocal

mklink /D "D:UserswcluMy Documents" D:UserswcluDocuments

mklink /D D:UserswcluNetHood

"D:UserswcluAppDataRoamingMicrosoftWindowsNetwork Shortcuts"

mklink /D D:UserswcluPrintHood

"D:UserswcluAppDataRoamingMicrosoftWindowsPrinter Shortcuts"

mklink /D D:UserswcluRecent

D:UserswcluAppDataRoamingMicrosoftWindowsRecent

mklink /D D:UserswcluSendTo

D:UserswcluAppDataRoamingMicrosoftWindowsSendTo

mklink /D D:UserswcluTemplates

D:UserswcluAppDataRoamingMicrosoftWindowsTemplates

mklink /D "D:Userswclu「开始」菜单"

"D:UserswcluAppDataRoamingMicrosoftWindowsStart Menu"

(wclu为本人的用户名,需要替换掉,将上述内容保存为.bat文件,执行,完美无暇、如假包换的用户目录诞生了。)

我看到进阶区有人在讨论这个,但是实际上不完整,而且不能link成功,但那边我没权限发帖,所以发这里和大家分享,如果有冲突了还请斑斑见谅!