Board logo

标题: [问题求助] 怎样用VBS实现自动识别系统分区,自动分配盘符? [打印本页]

作者: 5i365    时间: 2019-2-20 17:27     标题: 怎样用VBS实现自动识别系统分区,自动分配盘符?

本帖最后由 5i365 于 2019-2-20 17:28 编辑

情况是这样的,我的电脑刚安装好双系统(WIN7+WIN10)的时候,进入每个系统后,另一系统的分区都是可见的,怕误操作,所以想隐藏它,这我一般的处理是,打开磁盘管理,然后找到另一个系统所在的分区,右键,选择《更改驱动器号和路径》-----《删除》,这个操作就把另一系统的驱动器号删除了,也算是变相隐藏了分区,但是后面分区的盘符,就都要手动修改一下,两个系统下都要按上面的过程来一遍!

具体描述:WIN7是C盘,WIN10是D盘,软件盘是E盘,备份盘是F盘,把D盘驱动器号删除后,E盘要改为D盘,F盘要改为E盘。

我想请教各位高手,能不能把上面的操作实现:自动识别另一WIN系统分区,自动分配盘符,有没有可能性?

因为对VBS不熟悉,只懂点基本的批处理,想了一下大概的思路,

1.先识别当前硬盘是否存在两个系统分区,有则获取另一系统的驱动器号

2.使用VBS某个函数,删除驱动器号

3.使用VBS某个函数,循环分配后面的驱动器号

如果有大师有别的思路,也希望能不衰赐教,提前感谢!
作者: flashercs    时间: 2019-2-20 22:45

  1. Option Explicit
  2. ' On Error Resume Next
  3. Dim strDriveLetter,objWbemService,colVolumes,objVolume
  4. strDriveLetter = "D"
  5. Set objWbemService = GetObject("winmgmts:{ImpersonationLevel=Impersonate}!//./root/cimv2")
  6. Set colVolumes = objWbemService.ExecQuery("Select DeviceID,DriveLetter,Label,Name,SerialNumber From Win32_Volume Where BootVolume=False And SystemVolume=False And DriveType=3")
  7. For Each objVolume In colVolumes
  8. '系统盘卷标是Win7 或 Win10
  9.   If LCase(Left(objVolume.Label,3)) = "win" Then
  10.     objVolume.Dismount True,True
  11.     ' ShowError
  12.   Else
  13.     If UCase(Left(objVolume.DriveLetter,1)) <> strDriveLetter Then
  14.       objVolume.DriveLetter = strDriveLetter & ":"
  15.     End If
  16.     If strDriveLetter = "Z" Then Exit For
  17.     strDriveLetter = Chr(Asc(strDriveLetter) + 1)
  18.   End If
  19. Next
  20. Set objVolume = Nothing
  21. Set colVolumes = Nothing
  22. Set objWbemService = Nothing
复制代码

作者: 5i365    时间: 2019-2-20 23:02

本帖最后由 5i365 于 2019-2-20 23:04 编辑

回复 2# flashercs

感谢楼上朋友的帮忙,我双击VBS文件后没有任何反应,不知道怎么回事,我现在系统中的卷标,分别是win7  C:    win10  D:   DATA  G:
作者: flashercs    时间: 2019-2-20 23:43

以管理员身份打开cmd.exe,输入cscript -nologo A.vbs
回车
作者: flashercs    时间: 2019-2-20 23:53

A.vbs
  1. Option Explicit
  2. ' On Error Resume Next
  3. Dim strDriveLetter,objWbemService,colVolumes,objVolume
  4. strDriveLetter = "D"
  5. Set objWbemService = GetObject("winmgmts:{ImpersonationLevel=Impersonate}!//./root/cimv2")
  6. Set colVolumes = objWbemService.ExecQuery("Select DeviceID,DriveLetter,Label,Name,SerialNumber From Win32_Volume Where BootVolume=False And SystemVolume=False And DriveType=3")
  7. For Each objVolume In colVolumes
  8.   If LCase(Left(objVolume.Label,3)) = "win" Then
  9.     WSH.Echo "Dismounting volume: " & objVolume.DriveLetter & " with Label: " & objVolume.Label
  10.     objVolume.Dismount True,True
  11.     ' ShowError
  12.   Else
  13.     If UCase(Left(objVolume.DriveLetter,1)) <> strDriveLetter Then
  14.       WSH.Echo "Assign new driveLetter: " & strDriveLetter & " to " & strDriveLetter
  15.       objVolume.DriveLetter = strDriveLetter & ":"
  16.     End If
  17.     If strDriveLetter = "Z" Then Exit For
  18.     strDriveLetter = Chr(Asc(strDriveLetter) + 1)
  19.   End If
  20.   ' WSH.Echo objVolume.DriveLetter & vbTab & objVolume.DeviceID
  21. Next
  22. Set objVolume = Nothing
  23. Set colVolumes = Nothing
  24. Set objWbemService = Nothing
复制代码

作者: 5i365    时间: 2019-2-21 00:27

回复 5# flashercs
还是不行,目前就是AD帐户

    这是操作演示
https://ibb.co/4Zv8Wj0
作者: flashercs    时间: 2019-2-21 00:43

你权限不够啊
作者: flashercs    时间: 2019-2-21 00:59

本帖最后由 flashercs 于 2019-2-21 01:02 编辑
  1. Option Explicit
  2. ' On Error Resume Next
  3. Dim strDriveLetter,objWbemService,colVolumes,objVolume,retValue
  4. strDriveLetter = "D"
  5. Set objWbemService = GetObject("winmgmts:{ImpersonationLevel=Impersonate}!//./root/cimv2")
  6. Set colVolumes = objWbemService.ExecQuery("Select DeviceID,DriveLetter,Label,Name,SerialNumber From Win32_Volume Where BootVolume=False And SystemVolume=False And DriveType=3")
  7. For Each objVolume In colVolumes
  8.   If LCase(Left(objVolume.Label,3)) = "win" Then
  9.     WSH.Echo "Dismounting volume: " & objVolume.DriveLetter & " with Label: " & objVolume.Label
  10.     retValue = objVolume.Dismount(True,True)
  11.     If retValue = 0 Then
  12.       WSH.Echo "Success"
  13.     Else
  14.       WSH.Echo "Failed : " & retValue
  15.     End If
  16.     ' ShowError
  17.   Else
  18.     If UCase(Left(objVolume.DriveLetter,1)) <> strDriveLetter Then
  19.       WSH.Echo "Assign new driveLetter: " & objVolume.DriveLetter & ": to " & strDriveLetter & ":"
  20.       
  21.       objVolume.DriveLetter = strDriveLetter & ":"
  22.       
  23.       End If
  24.     If strDriveLetter = "Z" Then Exit For
  25.     strDriveLetter = Chr(Asc(strDriveLetter) + 1)
  26.   End If
  27.   ' WSH.Echo objVolume.DriveLetter & vbTab & objVolume.DeviceID
  28. Next
  29. Set objVolume = Nothing
  30. Set colVolumes = Nothing
  31. Set objWbemService = Nothing
复制代码

作者: 5i365    时间: 2019-2-21 01:42

回复 8# flashercs

非常感谢这么晚还给俺回复,现在系统是新安装的,开启的AD帐号,现在还是无法执行

下面是图片演示
https://www.z4a.net/image/7RbHFG
作者: flashercs    时间: 2019-2-21 11:59

回复 9# 5i365

关于如何获得管理员至高无上权限的方法,自行百度。下面这个可以检测是否获取最高权限。
  1. Option Explicit
  2. On Error Resume Next
  3. Dim strDriveLetter,objWbemService,colVolumes,objVolume,retValue
  4. Set objWbemService = GetObject("winmgmts:{ImpersonationLevel=Impersonate}!//./root/cimv2")
  5. objWbemService.Get "Win32_LogonSession.LogonId='999'"
  6. If Err.Number <> 0 Then
  7.   ' ShowError
  8.   WSH.Echo "Lower Privilege.权限太低了。"
  9.   Set objWbemService = Nothing
  10.   WSH.Quit 1
  11. End If
  12. strDriveLetter = "D"
  13. Set colVolumes = objWbemService.ExecQuery("Select DeviceID,DriveLetter,Label,Name,SerialNumber From Win32_Volume Where BootVolume=False And SystemVolume=False And DriveType=3")
  14. For Each objVolume In colVolumes
  15.   If LCase(Left(objVolume.Label,3)) = "win" Then
  16.     WSH.Echo "Dismounting volume: " & objVolume.DriveLetter & " with Label: " & objVolume.Label
  17.     retValue = objVolume.Dismount(True,True)
  18.     If retValue = 0 Then
  19.       WSH.Echo "Success"
  20.     Else
  21.       WSH.Echo "Failed : " & retValue
  22.     End If
  23.     ' ShowError
  24.   Else
  25.     If UCase(Left(objVolume.DriveLetter,1)) <> strDriveLetter Then
  26.       WSH.Echo "Assign new driveLetter: " & objVolume.DriveLetter & ": to " & strDriveLetter & ":"
  27.       ' retValue = objVolume.Dismount(True,False)
  28.       objVolume.DriveLetter = strDriveLetter & ":"
  29.       ' retValue = objVolume.Mount()
  30.     End If
  31.     If strDriveLetter = "Z" Then Exit For
  32.     strDriveLetter = Chr(Asc(strDriveLetter) + 1)
  33.   End If
  34.   ' WSH.Echo objVolume.DriveLetter & vbTab & objVolume.DeviceID
  35. Next
  36. Set objVolume = Nothing
  37. Set colVolumes = Nothing
  38. Set objWbemService = Nothing
复制代码

作者: 5i365    时间: 2019-2-21 12:10

回复 10# flashercs

上面的代码运行后,没有提示权限,下面是演示

https://ibb.co/8jbcc7N
作者: 5i365    时间: 2019-2-21 12:20

本帖最后由 5i365 于 2019-2-21 12:48 编辑

我在一款磁盘工具BOOTICE中的帮助中,看到它支持命令行,里面有如下的说明,但是我不懂怎么用VBS执行命令行,能帮助用这个第三方工具的命令行实现一下吗?感谢:

我试了一下,用bootice.exe /device=D: /partitions /delete_letter  可以删除D盘的盘符,但是分配盘符不成功!

【分区及格式化】
────────────────────────────────
BOOTICE [DEVICE] /partitions [operation]
────────────────────────────────
operation:
/hide            >> 隐藏 /device= 指定的分区
/assign_letter   >> 为指定分区分配盘符(自动分配第一个可用盘符)
/assign_letter=X >> 为指定分区分配盘符(盘符由用户指定)
/delete_letter   >> 删除指定分区的盘符
作者: 5i365    时间: 2019-2-21 12:55

回复 10# flashercs

在百度搜到下面的一个贴子,大师能给加到VBS中吗?我已经下载了PSexec,感谢

http://bbs.pcbeta.com/viewthread-1773720-1-1.html
作者: xczxczxcz    时间: 2019-2-21 15:59

Admistrator 对有些文件也无权读写。因某些文件的ACCESSCONTROL 需要添加owner提权才可操作。
作者: xp3000    时间: 2019-9-28 20:14

这个以后需要用到
作者: 窄口牛    时间: 2019-9-29 07:36

win10里面是c,Dwin7,Gdata?




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2