Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Определение всех букв одного физического диска (http://forum.oszone.net/showthread.php?t=222870)

sLiDeR-X 14-12-2011 08:06 1814864

Определение всех букв одного физического диска
 
Есть жесткий диск. На нем 2 раздела. Если я знаю, что буква одного раздела, допустим, X, то как мне узнать букву другого раздела?

Iska 14-12-2011 10:23 1814928

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 1814931

Iska, возможно и сойдет.
Как мне вывести результат в файл, чтоб можно было батником считать этот результат?
А vbs понимает ключи запуска? Допустим "Drives.vbs X:", чтоб не править каждый раз содержание для задания исходного диска?

Iska 14-12-2011 11:27 1814958

sLiDeR-X, всё сделаю ближе к ночи.

DmitriiV 14-12-2011 12:18 1814992

Пока 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 1814994

DmitriiV, как запускать?
"1.vbs X" не катит

DmitriiV 14-12-2011 12:49 1815003

cscript 1.vbs X

sLiDeR-X 14-12-2011 13:18 1815022

DmitriiV, а если это разбитая на разделы флешка?
Можно подкрутить?

DmitriiV 14-12-2011 14:16 1815077

Замените выражение WHERE DriveType=3 на выражение WHERE DriveType=2 OR DriveType=3 (в обоих случаях).

sLiDeR-X 14-12-2011 14:34 1815087

DmitriiV, спасибо, ты очень помог :)

А для чего это было надо? Ответ тут: http://forum.oszone.net/post-1812573.html#post1812573

DmitriiV 14-12-2011 14:46 1815097

Исправление: в первом случае надо выражение WHERE DriveType=3
заменить на выражение WHERE (DriveType=2 OR DriveType=3)
(забыл о приоритетах операций).

Iska 14-12-2011 15:46 1815135

sLiDeR-X, тем лучше: стало быть, я ничего больше не пишу нынче ночью.

sLiDeR-X 14-12-2011 16:07 1815143

Iska, спи уж, я разрешаю :)

sLiDeR-X 14-12-2011 20:05 1815289

DmitriiV, а на 64 битной системе будет работать?

DmitriiV 15-12-2011 16:54 1815914

Цитата:

Цитата sLiDeR-X
на 64 битной системе будет работать »

Будет.


Время: 18:26.

Время: 18:26.
© OSzone.net 2001-