花褪残红青杏小。燕子飞时,绿水人家绕。

subst(映射文件夹为磁盘)命令的一些坑

菜鸟编程 十五楼的鸟儿 13382浏览 0评论

1、背景

使用subst命令,你可以很容易的将一个文件夹映射为一个磁盘。这是cmd下自带的帮助信息:

C:\Users\Administrator>subst /?
将路径与驱动器号关联。

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

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

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

比如,直接运行:

subst X: D:\dirname

你可以创建一个磁盘,盘符为X,内容与D:\dirname等效,除了不能运行一些磁盘检测类的程序/指令,其他的文件读取写入都是一样的。

subst缺点就是每次重启电脑需要重新映射,不过可以写成批处理,放到启动菜单里。

 

微软官方关于subst的解释见截图(截图有效防止404)【点击可以放大】

subst(映射文件夹为磁盘)命令的一些坑  菜鸟编程  第1张

 

2、问题

并没有找到官方解释。第三方解释subst指令是基于“当前”用户上下文的。说人话就是A用户创建的盘符,B用户是看不见的,这里无论AB用户的权限如何,哪怕B比A的权限高也不行。

另外假设有这种情况:

你的电脑有两个用户,administrator处于被禁用的状态。另一个账号叫zhangsan,也是管理员权限。

此时你从cmd.exe上右键“以管理员身份运行”时,这个cmd的用户上下文居然是administrator,而不是zhangsan。

这导致了你以管理员身份运行cmd之后,执行subst指令映射了磁盘,无法直接在资源管理器中看到。但是使用“以管理员身份运行”的subst指令可以看到。

subst(映射文件夹为磁盘)命令的一些坑  菜鸟编程  第2张

 

最痛苦的是:

当你以当前用户身份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"

已知有两个问题:

  • 无法重命名磁盘。
  • 不能使用回收站,删除就直接没了,无法撤销。

个人极其不推荐这种方法,不确定还会不会有其他什么问题。

 

转载请注明:鸟儿博客 » subst(映射文件夹为磁盘)命令的一些坑

游客
发表我的评论 换个身份
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址