Windows 中的 mklink 命令

日常使用 Linux 的用户,想必对 ln 命令不会陌生。使用该命令,可以在 Linux 系统上创建针对文件或目录的符号链接,实现一个文件(目录)两个名字的功能。

Windows 上也有一个类似功能的命令,它是 mklink。不过它的行为和 ln 不太一样。此外,Windows 上还有「快捷方式」这种东西,也能实现一个文件(目录)两个名字的功能。但它和 mklink 建立的符号链接不一样,它是 Windows 上特有的一种文件格式,专门用来指向其它文件(目录)。

此篇讲讲 Windows 上的 mklink 命令。

速查表

不带参数 /D 参数 /H 参数 J 参数
中文名称 符号链接 符号链接 硬链接 联接
英文名称 Symbolic Link Symbolic Link Hard Link Junction
作用对象 文件 目录 文件 目录
是否一定指向路径
dir 类型 SYMLINK SYMLINK 无特殊显示 JUNCTION
资源管理器类型 .symlink 文件夹 无特殊显示 文件夹
资源管理器图标 快捷方式 文件夹快捷方式 无特殊显示 文件夹快捷方式
修改同步
删除同步
彻底删除源 删除源路径 删除源路径 删除所有硬链接 删除源路径
引用错误报错 引用了一个不可用的位置 - 引用了一个不可用的位置

详细说明

mklink 命令需要使用管理员权限,在 cmd.exe 中运行。在 Windows 7 中,可以在开始菜单中搜索 cmd,而后右键搜索结果,选择「以管理员身份运行」。

执行 mklink 命令,不带任何 flags 及 arguments,可以查看它的语法说明(官方网页版说明)。

1
2
3
4
5
6
7
8
9
10
11
12
D:\test>mklink
创建符号链接。

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

/D 创建目录符号链接。默认为文件
符号链接。
/H 创建硬链接,而不是符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径
(相对或绝对)。

不带参数

不带参数的 mklink 命令可以为文件创建符号链接。当源路径是目录时,不带参数的 mklink 不会报错,但是实际产生的符号链接不可用。在 cmd 中使用 dir 列出当前目录的文件列表时,符号链接显示为 SYMLINK,同时在文件名后以方括号表示链接的源地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
D:\test>mklink source_link.txt source.txt
为 source_link.txt <<===>> source.txt 创建的符号链接

D:\test>mklink source_link source
为 source_link <<===>> source 创建的符号链接

D:\test>dir
驱动器 D 中的卷是 Data
卷的序列号是 22FA-F6AC

D:\test 的目录

2018/12/10 16:18 <DIR> .
2018/12/10 16:18 <DIR> ..
2018/12/10 16:17 <DIR> source
2018/12/10 16:17 0 source.txt
2018/12/10 16:18 <SYMLINK> source_link [source]
2018/12/10 16:18 <SYMLINK> source_link.txt [source.txt]
3 个文件 0 字节
3 个目录 241,024,643,072 可用字节

不带参数的 mklink 创建的符号链接,展现在 Windows 资源管理器中的样式与普通的快捷方式没有两样——在图标的左下角有一个小箭头。不过,在资源管理器中,符号链接的文件类型是 .symlink。对于源路径是目录的情况,图标显示为一块白板。

删除不带参数的 mklink 创建的符号链接,不会影响源路径指向的文件。删除不带参数的 mklink 创建的符号链接指向的源文件,访问符号链接时无法访问。

参数 /D

参数 /D 版本的 mklink 命令可以为目录创建符号链接。当源路径是文件时,不带参数的 mklink 不会报错,但是实际产生的符号链接不可用;访问时会提示「目录名称无效」。在 cmd 中使用 dir 列出当前目录的文件列表时,符号链接显示为 SYMLINK,同时在文件名后以方括号表示链接的源地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
D:\test>mklink /D source_link source
为 source_link <<===>> source 创建的符号链接

D:\test>mklink /D source_link.txt source.txt
为 source_link.txt <<===>> source.txt 创建的符号链接

D:\test>dir
驱动器 D 中的卷是 Data
卷的序列号是 22FA-F6AC

D:\test 的目录

2018/12/10 16:27 <DIR> .
2018/12/10 16:27 <DIR> ..
2018/12/10 16:17 <DIR> source
2018/12/10 16:17 0 source.txt
2018/12/10 16:27 <SYMLINKD> source_link [source]
2018/12/10 16:27 <SYMLINKD> source_link.txt [source.txt]
1 个文件 0 字节
5 个目录 241,024,618,496 可用字节

参数 /D 版本的 mklink 命令创建的符号链接,展现在 Windows 资源管理器中的样式与普通的快捷方式没有两样——在图标的左下角有一个小箭头。不过,在资源管理器中,符号链接的文件类型是「文件夹」。对于源路径是文件的情况,图标显示为空目录的样式。

删除参数 /D 版本的 mklink 命令创建的符号链接,不会影响源路径指向的文件。删除参数 /D 版本的 mklink 命令创建的符号链接指向的源文件,访问符号链接时无法访问;提示「引用了一个不可用的位置」。

参数 /H

参数 /H 版本的 mklink 命令可以为文件创建硬链接。当源路径是目录时,不带参数的 mklink 会报错「拒绝访问」。在 cmd 中使用 dir 列出当前目录的文件列表时,硬链接的样式与正常文件没什么不同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
D:\test>mklink /H source_link.txt source.txt
为 source_link.txt <<===>> source.txt 创建了硬链接

D:\test>mklink /H source_link source
拒绝访问。

D:\test>dir
驱动器 D 中的卷是 Data
卷的序列号是 22FA-F6AC

D:\test 的目录

2018/12/10 16:38 <DIR> .
2018/12/10 16:38 <DIR> ..
2018/12/10 16:35 <DIR> source
2018/12/10 16:17 0 source.txt
2018/12/10 16:17 0 source_link.txt
2 个文件 0 字节
3 个目录 241,024,421,888 可用字节

参数 /H 版本的 mklink 命令创建的硬链接,展现在 Windows 资源管理器中的样式与源文件一致。

删除参数 /H 版本的 mklink 命令创建的硬链接,不会影响源路径指向的文件。删除参数 /H 版本的 mklink 命令创建的硬链接指向的源文件,也不会影响硬链接。只有当一个文件的所有硬链接都被删除时,文件才被真正删除。

参数 /J

参数 /J 版本的 mklink 命令可以为目录创建联接。当源路径是文件时,不带参数的 mklink 不会报错,但是实际产生的联接不可用;访问时会提示「目录名称无效」。在 cmd 中使用 dir 列出当前目录的文件列表时,联接显示为 JUNCTION,同时在文件名后以方括号表示链接的源地址的绝对路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
D:\test>mklink /J source_link.txt source.txt
为 source_link.txt <<===>> source.txt 创建的联接

D:\test>mklink /J source_link source
为 source_link <<===>> source 创建的联接

D:\test>dir
驱动器 D 中的卷是 Data
卷的序列号是 22FA-F6AC

D:\test 的目录

2018/12/10 16:43 <DIR> .
2018/12/10 16:43 <DIR> ..
2018/12/10 16:35 <DIR> source
2018/12/10 16:41 2 source.txt
2018/12/10 16:43 <JUNCTION> source_link [D:\test\source]
2018/12/10 16:43 <JUNCTION> source_link.txt [D:\test\source.txt]
1 个文件 2 字节
5 个目录 241,024,319,488 可用字节

参数 /J 版本的 mklink 命令创建的联接,展现在 Windows 资源管理器中的样式与普通的快捷方式没有两样——在图标的左下角有一个小箭头。不过,在资源管理器中,联接的文件类型是「文件夹」。对于源路径是文件的情况,图标显示为空目录的样式。

删除参数 /J 版本的 mklink 命令创建的联接,不会影响源路径指向的文件。删除参数 /J 版本的 mklink 命令创建的联接指向的源文件,访问联接时无法访问;提示「引用了一个不可用的位置」。

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。