2012-02-19 4 views
1

다음 WMI 스크립트를 실행하여 시스템의 드라이브 문자와 물리적 드라이브 간의 연결을 가져 오지만 어떤 이유로 CDROM/DVD-ROM이 누락됩니다. 누군가 그걸 어떻게 얻을 수 있는지 말해 줄 수 있습니까?물리적 드라이브 경로와 드라이브 문자 연결을 가져오고 CDROM을 놓친 경우

ComputerName = "." 
Set wmiServices = GetObject _ 
    ("winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName) 
Set wmiDiskDrives = wmiServices.ExecQuery _ 
    ("SELECT DeviceID FROM Win32_DiskDrive") 

For Each wmiDiskDrive In wmiDiskDrives 
    strEscapedDeviceID = _ 
     Replace(wmiDiskDrive.DeviceID, "\", "\\", 1, -1, vbTextCompare) 
    Set wmiDiskPartitions = wmiServices.ExecQuery _ 
     ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & _ 
      strEscapedDeviceID & """} WHERE " & _ 
       "AssocClass = Win32_DiskDriveToDiskPartition") 

    For Each wmiDiskPartition In wmiDiskPartitions 
     Set wmiLogicalDisks = wmiServices.ExecQuery _ 
      ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & _ 
       wmiDiskPartition.DeviceID & """} WHERE " & _ 
        "AssocClass = Win32_LogicalDiskToPartition") 

     For Each wmiLogicalDisk In wmiLogicalDisks 
      WScript.Echo wmiLogicalDisk.DeviceID & " = " & wmiDiskDrive.DeviceID 
     Next 
    Next 
Next 
+0

이 코드는 드라이브 문자가 논리 디스크 파티션과 관련되어 있음을 감지합니다. 실제로 원하는 것입니까? [FSO를 사용하여 디스크 드라이브 속성 열거] (http://www.activexperts.com/activmonitor/windowsmanagement/adminscripts/disk/drives/#EnumDiskDrive.htm)와 같은 간단한 코드처럼 들릴 수 있습니까? – brettdj

+0

고마워요,하지만 그건 내가 필요로하는 것이 아닙니다. 현재 스크립트 (실행중인 경우)는 드라이브 문자와 실제 드라이브 경로 간의 상관 관계를 생성합니다. "C :"= "\\. \ PhysicalDrive0"과 같은 형식이지만 내 CD 드라이브 (예 : "D :"= "\\. \ CDROM0")는 동일하게 생성되지 않습니다. 왜 그런지 알고 싶습니까? – ahmd0

답변

3

, 여기에 CD-ROM 드라이브를 나열 할 수있는 기능을 추가하는 스크립트입니다.

ComputerName = "." 

Set dictDrives = CreateObject("Scripting.Dictionary") 
Set listDriveLetters = CreateObject("System.Collections.ArrayList") 

Set wmiServices = GetObject _ 
    ("winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName) 
Set wmiDiskDrives = wmiServices.ExecQuery _ 
    ("SELECT DeviceID FROM Win32_DiskDrive") 

For Each wmiDiskDrive In wmiDiskDrives 
    strEscapedDeviceID = Replace(wmiDiskDrive.DeviceID, "\", "\\", 1, -1, vbTextCompare) 
    Set wmiDiskPartitions = wmiServices.ExecQuery _ 
     ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & _ 
      strEscapedDeviceID & """} WHERE " & _ 
       "AssocClass = Win32_DiskDriveToDiskPartition") 

    For Each wmiDiskPartition In wmiDiskPartitions 
     Set wmiLogicalDisks = wmiServices.ExecQuery _ 
      ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & _ 
       wmiDiskPartition.DeviceID & """} WHERE " & _ 
        "AssocClass = Win32_LogicalDiskToPartition") 

     For Each wmiLogicalDisk In wmiLogicalDisks 
      listDriveLetters.Add wmiLogicalDisk.DeviceID 
      dictDrives.Add wmiLogicalDisk.DeviceID, wmiDiskDrive.DeviceID 
     Next 
    Next 
Next 

Set wmiCDROMDrives = wmiServices.ExecQuery _ 
    ("Select DeviceID, Drive, MediaLoaded from Win32_CDROMDrive") 

For Each wmiCDROMDrive in wmiCDROMDrives 
    If wmiCDROMDrive.MediaLoaded Then   ' Only show drives with inserted media 
     listDriveLetters.Add wmiCDROMDrive.Drive 
     dictDrives.Add wmiCDROMDrive.Drive, wmiCDROMDrive.DeviceID 
    End If 
Next 

listDriveLetters.Sort       ' List the drives in alphabetical order 

For Each strDriveLetter in listDriveLetters 
    WScript.Echo strDriveLetter & " = " & dictDrives.Item(strDriveLetter) 
Next 
+0

감사합니다. 이것은 지금 아주 가깝다. D : = IDE \ CDROMHL-DT-ST_DVD + -RW_GH50N __________________ B103 ____이 \ 4 363F6EBE & 0 & 0.1.0 – ahmd0

+0

@ahmdo 그래서 당신이 아래에있는 내 코드를 시도하지 않았다 (top_에서 동일하게 제공 스크립트 나 대신 CDROM에 대한 실제 경로의 다음을 제공합니다 CD-ROM의 정보에 대한 출력, 즉'wmiDiskDrive.drive & "="& wmiDiskDrive.DeviceID'? +1 BTW Nilpo – brettdj

+1

@ \ cdrom0에이 Win32_PhysicalMedia 클래스의 태그 속성에서만 발견 될 수 \\ 같은 실제 경로 ahmd0. .이것을 연결하는 다른 연관된 클래스 나 속성이 없습니다. 직접 장치를 열거해야합니다. 예를 들어 Win32_SystemDevices 클래스를 사용할 수 있습니다. 첫 번째 CD-ROM은 마운트 포인트 0에, 두 번째 CD-ROM은 마운트 포인트 1에 있습니다. Win32_CDROMDrive 클래스와의 연관을 통해 필터링 될 수 있습니다. – Nilpo

2

난 당신이 CD-ROM 정보에 액세스 할 수 Win32_CDROMDrive WMI 클래스를 사용할 필요가 같으면 생각합니다. 위의 코드는 Win32_DiskDrive 클래스의 실제 드라이브를 찾고 있습니다. CD_ROM은 제외합니다.

유사한 데이터를 얻으려면 추가 행을 추가 할 수 있지만 동일한 CD-ROM에는 현재 코드가 아닌 파티션 특성이 없습니다. 5 월 부분을 내가 파티션 정보가 당신에게 관련되어 있다고 생각하지 말아로 -

ComputerName = "." 
Set wmiServices = GetObject _ 
        ("winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName) 
Set wmiDiskDrives = wmiServices.ExecQuery _ 
        ("SELECT * FROM Win32_CDROMDrive") 
For Each wmiDiskDrive In wmiDiskDrives 
    MsgBox wmiDiskDrive.drive & "=" & wmiDiskDrive.DeviceID 
Next 

대신 나는이 다른 VBS 당신이 원하는 것을 할 수있다 생각한다.

버전

Dim objFSO 
Dim colDrives 
Dim strOut 
Dim strArray 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set colDrives = objFSO.Drives 
strArray = Array("Unknown", "Removable", "Fixed", "Network", "CD-ROM", "RAM Disk") 
On Error Resume Next 
'File system errors for virtual drives 
For Each objDrive In colDrives 
    strOut = "Drive letter: " & objDrive.DriveLetter & vbNewLine 
    strOut = strOut & ("Drive type: " & strArray(objDrive.DriveType) & vbNewLine) 
    strOut = strOut & ("File system: " & objDrive.FileSystem & vbNewLine) 
    strOut = strOut & ("Path: " & objDrive.Path) 
    wscript.echo strOut 
Next 
On Error GoTo 0 

버전까지 의견을 모두 고려

Sub Test() 
Dim objFSO As Object 
Dim colDrives As Object 
Dim strOut As String 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set colDrives = objFSO.Drives 
On Error Resume Next 
'File system errors for virtual drives 
For Each objDrive In colDrives 
    strOut = "Drive letter: " & objDrive.DriveLetter & vbNewLine 
    strOut = strOut & ("Drive type: " & Choose(objDrive.DriveType + 1, "Unknown", "Removable", "Fixed", "Network", "CD-ROM", "RAM Disk") & vbNewLine) 
    strOut = strOut & ("File system: " & objDrive.FileSystem & vbNewLine) 
    strOut = strOut & ("Path: " & objDrive.Path) 
    MsgBox strOut 
Next 
On Error GoTo 0 
End Sub 
+1

이것이 맞습니다. Win32_DiskDrive 클래스에는 광학 드라이브가 포함되어 있지 않습니다. – Nilpo

+0

@brettdj 고마워요.하지만 꼭 필요한 것은 아닙니다. 다시 말하지만,이 코드의 목적은 드라이브 문자와 드라이브의 물리적 경로를 연결하는 것입니다. "C :"= "\\. \ PhysicalDrive0", "D :"= "\\. \ CDROM0", "E :"= "\\. \ PhysicalDrive2" – ahmd0

+0

@Nilpo 예, Win32_DiskDrive에는 광학 드라이브가 포함되어 있지 않지만 Win32_PhysicalMedia에는 ​​포함되어 있으며 DeviceID 대신 Tag 속성을 사용할 수 있지만 코드는 ASSOCIATORS OF 부분에서 결과를 생성하지 못하며 불행히도 WMI를 잘 수정하지 못한다는 것을 알았습니다. 이 앞면에 어떤 아이디어가 있니? – ahmd0

관련 문제