Войти

Показать полную графическую версию : [решено] Определение всех букв одного физического диска


sLiDeR-X
14-12-2011, 08:06
Есть жесткий диск. На нем 2 раздела. Если я знаю, что буква одного раздела, допустим, X, то как мне узнать букву другого раздела?

Iska
14-12-2011, 10:23
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:", чтоб не править каждый раз содержание для задания исходного диска?

Iska
14-12-2011, 11:27
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)
(забыл о приоритетах операций).

Iska
14-12-2011, 15:46
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