Показать полную графическую версию : [решено] Определение всех букв одного физического диска
sLiDeR-X
14-12-2011, 08:06
Есть жесткий диск. На нем 2 раздела. Если я знаю, что буква одного раздела, допустим, X, то как мне узнать букву другого раздела?
sLiDeR-X, WSH не сгодится ли? Вот примерный шаблон:
Option Explicit
Dim strDriveLetter
Dim strComputer
Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx_Win32_LogicalDisk
Dim objSWbemObjectEx_Win32_DiskPartition
Dim objSWbemObjectEx_Win32_DiskDrive
strDriveLetter = "X:"
strComputer = "."
Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set objSWbemObjectEx_Win32_LogicalDisk = objSWbemServicesEx.Get("Win32_LogicalDisk.DeviceID='" & strDriveLetter & "'")
For Each objSWbemObjectEx_Win32_DiskPartition In objSWbemObjectEx_Win32_LogicalDisk.Associators_(, "Win32_DiskPartition")
'WScript.Echo objSWbemObjectEx_Win32_DiskPartition.Path_
Exit For
Next
For Each objSWbemObjectEx_Win32_DiskDrive In objSWbemObjectEx_Win32_DiskPartition.Associators_(, "Win32_DiskDrive")
'WScript.Echo objSWbemObjectEx_Win32_DiskDrive.Path_
Exit For
Next
For Each objSWbemObjectEx_Win32_DiskPartition In objSWbemObjectEx_Win32_DiskDrive.Associators_(, "Win32_DiskPartition")
'WScript.Echo objSWbemObjectEx_Win32_DiskPartition.Path_
For Each objSWbemObjectEx_Win32_LogicalDisk In objSWbemObjectEx_Win32_DiskPartition.Associators_(, "Win32_LogicalDisk")
If UCase(objSWbemObjectEx_Win32_LogicalDisk.Caption) <> UCase(strDriveLetter) Then
WScript.Echo objSWbemObjectEx_Win32_LogicalDisk.Caption
End If
Next
Next
WScript.Quit 0
По указанной букве раздела он должен показывать остальные буквы того же диска. Без каких-либо проверок (добавьте, по потребности, для реальной работы).
sLiDeR-X
14-12-2011, 10:34
Iska, возможно и сойдет.
Как мне вывести результат в файл, чтоб можно было батником считать этот результат?
А vbs понимает ключи запуска? Допустим "Drives.vbs X:", чтоб не править каждый раз содержание для задания исходного диска?
sLiDeR-X, всё сделаю ближе к ночи.
DmitriiV
14-12-2011, 12:18
Пока Iska думает, предложу свой вариант сценария.
Впрочем, и метод, и инструмент - те же.
Dim objWMI, objLogicalDisks, objLD
Dim objPartitions, objPart, objDrives, objDrive, objFS
Dim objArgs, objDict
Dim strLog, strTranslator, strLetter, strList, strTemp, intTemp
strLog = "Volumes.log"
Set objFS = CreateObject("Scripting.FileSystemObject")
strTranslator = objFS.GetBaseName(WScript.FullName)
If StrComp(strTranslator, "cscript", vbTextCompare) = 0 Then
strLog = objFS.BuildPath(objFS.GetParentFolderName(WScript.ScriptFullName), strLog)
Set objArgs = WScript.Arguments
Select Case objArgs.Count
Case 0: WScript.Echo "Наличие аргумента обязательно."
Case 1
strLetter = objArgs.Item(0)
If Len(strLetter) > 1 Then strLetter = Left(strLetter, 1)
intTemp = Asc(strLetter)
If (intTemp >= Asc("c") And intTemp <= Asc("z")) Or (intTemp >= Asc("C") And intTemp <= Asc("Z")) Then
strLetter = strLetter & ":"
Set objDict = CreateObject("Scripting.Dictionary")
objDict.CompareMode = 1
Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
If objWMI.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType=3 AND DeviceID='" & strLetter & "'").Count > 0 Then
Set objLogicalDisks = objWMI.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType=3")
For Each objLD In objLogicalDisks
Set objPartitions = objWMI.ExecQuery("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID=""" & _
objLD.DeviceID & _
"""} WHERE AssocClass=Win32_LogicalDiskToPartition")
For Each objPart In objPartitions
Set objDrives = objWMI.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & _
objPart.DeviceID & _
"""} WHERE AssocClass=Win32_DiskDriveToDiskPartition")
For Each objDrive In objDrives
strTemp = objLD.DeviceID
If Not objDict.Exists(strTemp) Then objDict.Add strTemp, objDrive.Index
Next
Set objDrive = Nothing
Set objDrives = Nothing
Next
Set objPart = Nothing
Set objPartitions = Nothing
Next
Set objLD = Nothing
Set objLogicalDisks = Nothing
intTemp = objDict.Item(strLetter)
For Each strTemp In objDict.Keys
If objDict.Item(strTemp) = intTemp Then strList = strList & strTemp & vbNewLine
Next
Set objDict = Nothing
'WScript.Echo strList
Set objFile = objFS.CreateTextFile(strLog, True)
objFile.Write strList
objFile.Close
Set objFile = Nothing
Else
WScript.Echo "Том с заданным именем среди томов НЖМД не найден."
End If
Set objWMI = Nothing
Else
WScript.Echo "Неверное значение аргумента."
End If
Case Else: WScript.Echo "Много аргументов."
End Select
Set objArgs = Nothing
Else
WScript.Echo "Сценарий предназначен для работы в консольном режиме."
End If
Set objFS = Nothing
WScript.Quit 0
Аргумент единственный - имя тома (с двоеточием или без него - безразлично).
sLiDeR-X
14-12-2011, 12:33
DmitriiV, как запускать?
"1.vbs X" не катит
DmitriiV
14-12-2011, 12:49
cscript 1.vbs X
sLiDeR-X
14-12-2011, 13:18
DmitriiV, а если это разбитая на разделы флешка?
Можно подкрутить?
DmitriiV
14-12-2011, 14:16
Замените выражение WHERE DriveType=3 на выражение WHERE DriveType=2 OR DriveType=3 (в обоих случаях).
sLiDeR-X
14-12-2011, 14:34
DmitriiV, спасибо, ты очень помог :)
А для чего это было надо? Ответ тут: http://forum.oszone.net/post-1812573.html#post1812573
DmitriiV
14-12-2011, 14:46
Исправление: в первом случае надо выражение WHERE DriveType=3
заменить на выражение WHERE (DriveType=2 OR DriveType=3)
(забыл о приоритетах операций).
sLiDeR-X, тем лучше: стало быть, я ничего больше не пишу нынче ночью.
sLiDeR-X
14-12-2011, 16:07
Iska, спи уж, я разрешаю :)
sLiDeR-X
14-12-2011, 20:05
DmitriiV, а на 64 битной системе будет работать?
DmitriiV
15-12-2011, 16:54
на 64 битной системе будет работать »Будет.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.