1、背景
使用subst命令,你可以很容易的将一个文件夹映射为一个磁盘。这是cmd下自带的帮助信息:
C:\Users\Administrator>subst /?
将路径与驱动器号关联。
SUBST [drive1: [drive2:]path]
SUBST drive1: /D
drive1: 指定要分配路径的虚拟驱动器。
[drive2:]path 指定物理驱动器和要分配给虚拟驱动器的路径。
/D 删除被替换的
(虚拟)驱动器。
不带参数键入 SUBST,以显示当前虚拟驱动器的列表。
比如,直接运行:
1. subst X: D:\dirname
你可以创建一个磁盘,盘符为X,内容与D:dirname等效,除了不能运行一些磁盘检测类的程序/指令,其他的文件读取写入都是一样的。
subst缺点就是每次重启电脑需要重新映射,不过可以写成批处理,放到启动菜单里。
微软官方关于subst的解释见截图(截图有效防止404)【点击可以放大】
2、问题
并没有找到官方解释。第三方解释subst指令是基于“当前”用户上下文的。说人话就是A用户创建的盘符,B用户是看不见的,这里无论AB用户的权限如何,哪怕B比A的权限高也不行。
另外假设有这种情况:
你的电脑有两个用户,administrator处于被禁用的状态。另一个账号叫zhangsan,也是管理员权限。
此时你从cmd.exe上右键“以管理员身份运行”时,这个cmd的用户上下文居然是administrator,而不是zhangsan。
这导致了你以管理员身份运行cmd之后,执行subst指令映射了磁盘,无法直接在资源管理器中看到。但是使用“以管理员身份运行”的subst指令可以看到。
最痛苦的是:
当你以当前用户身份zhangsan执行cmd,映射为磁盘后。 你编写的其他程序,如果是管理员身份运行的,也读写不到zhangsan创建映射盘符。
3、解决方案
目前找到的所有解决方案都不如直接使用subst效果好。或者有潜在的其他问题的可能。
建议方案有两个:
- 摆烂,看不见就看不见,程序能跑就行。
- 以当前用户身份运行cmd程序,并执行subst指令。如果有编写其他程序,如果可能,降低其权限要求,能不用管理员就别用管理员了。
4、补充,网上一些其他解决方案:
1、分别以两种身份运行subst指令。这算是一种稍微好一点的方案,但是麻烦。
2、第二种使用修改系统注册表的办法
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices]
"X:"="\\??\\D:\\dirname1"
"Y:"="\\??\\D:\\dirname2"
已知有两个问题:
- 无法重命名磁盘。
- 不能使用回收站,删除就直接没了,无法撤销。
个人极其不推荐这种方法,不确定还会不会有其他什么问题。